Rails 4:使用remote:true在link_to helper中设置自定义redirect_to

时间:2015-11-14 01:52:42

标签: ruby-on-rails ajax ruby-on-rails-4 redirect link-to

在我的Rails 4应用中,我有一个calendar和一个post模型:calendar has_many postpost belong_to calendar

Calendars#Show中,我会显示属于此post的所有calendar

在同一视图中,我使用以下链接update approval post自定义属性:

<%= link_to post_path(:id => @post.id, "post[approval]" => "ok"), :method => :patch %>

问题,点击此链接后,我会看到此帖子的Posts#Show视图。

我想要的是保持同一Calendars#Show视图。

我想在控制器中的redirect_to :back操作中实现Posts#Update,但这是不可能的,因为当我更新帖子时,这会将我重定向到Posts#Edit视图这个Posts#Edit视图非常相同。

因此,我正在寻找一种解决方案,专门针对link_to remote: trueCalendars#ShowCalendars#Show的{​​{1}}帮助实施redirect_to。

这可能吗?

2 个答案:

答案 0 :(得分:1)

  

remote: true

如果您正在使用remote(您的代码段拥有它),那么您不会重定向:< / p>

<%= link_to post_path(:id => @post.id, "post[approval]" => "ok"), :method => :patch, remote :true %>

remote: true功能调用ajax,这是对您的服务器的XML调用(通过JS)。由于呼叫超出范围&#34; (IE不是标准&#34;请求&#34;),它不会对您当前的浏览器状态进行任何更改,除非您自己触发它们:

#app/controllers/posts_controller.rb
class PostsController < ApplicationController
   def update
      @post = Post.find params[:id]
      respond_to do |format|
         if @post.update
           format.json #-> fired only when json is datatype
           format.js #-> invokes app/views/posts/update.js.erb
           format.html { redirect_to @post } #-> only fires on http request
         end
      end
   end
end

#app/views/posts/update.js.erb
## do what you want here
  

Calendars#ShowCalendars#Show

如果您想刷新页面,可以使用:

#app/views/posts/update.js.erb
window.location.reload(true);

-

为了给你更多的背景信息, ajax 代表 a 同义 j avascript a nd X 毫升。这意味着您与其一起发送的每个请求都被视为asynchronous - 或超出&#34;正常&#34;的范围。 HTTP请求。

enter image description here

Ajax请求意味着用于将更改/更新应用于已加载的页面。一个很好的例子是聊天系统或其他东西。

您在Ajax响应之后如何重定向的问题虽然没有错,但绝对违反了它的工作方式。如果您想在尝试时创建重定向,我强烈建议您在操作中使用标准HTTP请求,并附带一些条件:

#app/controllers/posts_controller.rb
class PostsController < ApplicationController
   def update
       @post = Post.find params[:id]
       @post.update post_params
       redirect_to posts_path if @post.approved.changed?
       redirect_to root_path if ....
   end
end

答案 1 :(得分:0)

由于这是一个AJAX请求,因此在Post控制器中需要响应js:

def update
  # ...
  respond_to do |format|
    if @post.update(post_params)
      format.js { head :ok } # see here no redirects
      # ... other formats
    else
      # ...
    end
  end
end