2012-11-08 55 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