【问题标题】:Rails 3: "redirect_to" doesn't work well after Ajax callRails 3:“redirect_to”在 Ajax 调用后无法正常工作
【发布时间】:2011-05-01 13:35:19
【问题描述】:

在我的 Rails 3 应用程序中,用户使用 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 =&gt; 'index')执行了,但是页面没有刷新,即我没有看到新消息。

为什么?

【问题讨论】:

标签: ruby-on-rails ajax ruby-on-rails-3


【解决方案1】:

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?

【讨论】:

  • 那么如何在redirected_to 页面上呈现错误和通知消息?
  • @EricSteen 使用闪存哈希,例如flash[:error] = "Oh no!" 然后在控制器操作或重定向到您的视图中可以访问该消息,例如The error was: &lt;%= flash[:error] %&gt;
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2013-01-17
    • 2021-04-27
    相关资源
    最近更新 更多