0

我有一个 Rails 控制器设置,当用户创建新记录时,它将再次重定向到新操作并用新数据填充表单,这可以继续循环,创建新记录并重定向到新动作。我遇到的麻烦是将 AJAX 添加到此,以便用户可以留在此循环中而无需重新加载页面。这是我没有 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

新的.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 %>

创建.js.erb

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

1 回答 1

3

代码对我来说似乎很好。它不应该重定向到 show 动作。确保:

  1. 你有gem 'jquery-rails'你的Gemfile

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

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

    //= require jquery
    //= require jquery_ujs
    

好的,所以这里的问题是您<%= form_for @response do |f| %>_form部分中包含了该行。为什么这是个问题?好吧,当一个对象@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对象。

于 2012-11-08T01:45:07.553 回答