2011-05-01 58 views
1

在我的Rails 3應用程序用戶將使用Ajax的新信息,以論壇:的Rails 3: 「redirect_to的」 不Ajax調用後很好地工作

<%= form_tag("/forum/add_new_message", :remote => true) do %> 
    <%= text_area_tag("new_message_area") %> 
<% end %> 

這裏是我的控制器代碼:

def index 
    @messages = Message.all 
end 

def add_new_message 
    Message.create(:text => params[:new_message_area], ...)     
    redirect_to(:action => 'index') 
end 

的問題是,用戶添加一個新的消息,redirect_to(:action => 'index')執行之後,但網頁不刷新,即我沒有看到新的消息。

爲什麼?

+0

見http://stackoverflow.com/questions/5454806/rails-3-how-to-redirect-to- in-ajax-call/18443966 – Yarin 2013-08-26 12:32:00

回答

5

Web瀏覽器期待AJAX​​調用後要執行一些JavaScript。在瀏覽器中禁用javascript時,您的代碼應該可以正常工作。

在add_new_message方法你應該增加:

respond_to do |format| 
    format.html { redirect_to(:action => 'index') } 
    format.js 
end 

然後在add_new_message.js.erb一些JavaScript將被執行,所以重定向到索引,在add_new_message.js.erb代碼應該看起來像:

window.location = '<%= forums_path %>'; //or whatever other path 

雖然HTML和JavaScript都做同樣的事情。爲什麼首先需要ajax?

+0

但是,那麼如何在redirected_to頁面上呈現錯誤和通知消息? – 2012-07-19 18:02:39

+0

@EricSteen使用閃存散列,例如'flash [:error] =「Oh no!」'然後在被重定向到的控制器動作或視圖中可以訪問該消息,例如,錯誤是:<%= flash [:error]%>' – SuperMaximo93 2012-07-22 16:34:55

2

我會忍不住去控制器是這樣的:

def index 
    @messages = Message.all 
end 

def add_new_message 
    Message.create(:text => params[:new_message_area], ...)     
    render js: %(window.location.pathname='#{messages_path}') 
end