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

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を追加しようとする私の試みです。ただし、show アクションに移動して更新を行っています。新しいアクションにリダイレクトし続け、ユーザーが無限ループで新しいレコードを作成し続けることができるように、コードを修正するにはどうすればよいですか?

 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") %>');
4

1 に答える 1

3

コードは私には問題ないようです。ショーアクションにリダイレクトするべきではありません。次のことを確認してください。

  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 に答える