2012-11-08 111 views
0

我有一个Rails控制器设置,当用户创建一个新记录时,它将再次重定向到新动作并用新数据填充表单,并且这可以在循环中继续,创建新记录并重定向到新动作。我遇到的麻烦是将AJAX添加到此,以便用户可以停留在此循环中而无需重新加载页面。这里是我的代码,而AJAX:Ruby on Rails - 通过AJAX不断循环新/创建动作

class ResponsesController 
def new 
    @response = Response.new 
    @answer_a = Answer.find(rand(1..100)) 
    @answer_b = Answer.find(rand(1..100)) 
    @answer_c = Answer.find(rand(1..100)) 
end 

def create 
    @response = current_user.responses.build(params[:response]) 
    if @response.save 
     respond_to do |format| 
     format.html { redirect_to new_response_path } 
     format.js 
     end 
    else 
     render 'new' 
    end 
end 
end 

new.html.erb

<div id="response_form"> 
    <%= render 'form' %> 
</div> 

_form.html.erb

<%= form_for @response do |f| %> 
    <%= f.radio_button :user_answer, @answer_a.id %> 
    <%= @answer_a.description %> 
    <%= f.radio_button :user_answer, @answer_b.id %> 
    <%= @answer_b.description %> 
    <%= f.radio_button :user_answer, @answer_c.id %> 
    <%= @answer_c.description %> 
    <%= f.submit "Answer" %>     
<% end %> 

下面是我尝试添加AJAX。但是,它正在进行演出并进行更新。我如何修复我的代码,以便它可以保持重定向到新的动作,并且用户可以继续在无限循环上创建新记录?

def create 
    @answer_a = Answer.find(rand(1..100)) 
    @answer_b = Answer.find(rand(1..100)) 
    @answer_c = Answer.find(rand(1..100)) 
    @response = current_user.responses.build(params[:response]) 
    if @response.save 
     respond_to do |format| 
     format.html { redirect_to new_response_path } 
     format.js 
     end 
    else 
     render 'new' 
    end 
end 

_form.html.erb

<%= form_for @response, :remote => true do |f| %> 
    <%= f.radio_button :user_answer, @answer_a.id %> 
    <%= @answer_a.description %> 
    <%= f.radio_button :user_answer, @answer_b.id %> 
    <%= @answer_b.description %> 
    <%= f.radio_button :user_answer, @answer_c.id %> 
    <%= @answer_c.description %> 
    <%= f.submit "Answer" %>     
<% end %> 

create.js.erb

$('#response_form').html('<%= j render("form") %>'); 
+2

请注意,不要像那样获得随机记录。如果没有找到记录,则会返回零对象,并且会出现很多漂亮的错误,特别是当您尝试使用@ answer_a.description调用它们时。看到这里:http://stackoverflow.com/questions/5342270/rails-3-get-random-record –

回答

3

代码似乎被我的罚款。它不应该重定向到演出。确保:

  1. 你有gem 'jquery-rails'Gemfile

  2. 你在你的application.html.erb文件中有<%= javascript_include_tag 'application' %>

  3. 您的application.js文件中以下行

    //= require jquery 
    //= require jquery_ujs 
    

好的,所以这里的问题在于你在_form部分中包含<%= form_for @response do |f| %>行。为什么这是一个问题?那么,当一个对象@response不存在,Rails的呈现形式是这样的:

<form accept-charset="UTF-8" action="/responses" method="post"> 

当一个对象@response存在,Rails的呈现这样的形式:

<form accept-charset="UTF-8" action="/responses/id_of_the_response" method="post"> 

Rails会这因为它知道@response存在,所以它只是合乎逻辑的,你想更新它(而不是再次创建它)。

这里的解决方案是将的form_for改成这样:

<%= form_for @response, :url => { :action => :create, :method => :post } do |f| %> 

另外,还要留意的是build不保存@response对象。

+0

我第一次点击提交,它正确地取代了HTML,但它然后:'开始PUT“/响应/ 66“处理通过ResponsesController#更新为JS'和'完成500内部服务器错误在30ms的ActionView :: MissingTemplate(缺少模板响应/显示”#: – diasks2

+0

嗯,这是说你错过了'响应show'视图。可能你忘了编辑那个动作? – Ashitaka

+0

我想这是我不理解的部分,我希望它能够循环执行新的/创建动作,但是当我更改代码以使用AJAX ,为什么它试图去更新操作? – diasks2