在我的Rails 4应用中,我有一个calendar
和一个post
模型:calendar
has_many
post
和post
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: true
从Calendars#Show
到Calendars#Show
的{{1}}帮助实施redirect_to。
这可能吗?
答案 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#Show
到Calendars#Show
如果您想刷新页面,可以使用:
#app/views/posts/update.js.erb
window.location.reload(true);
-
为了给你更多的背景信息, ajax 代表 a 同义 j avascript a nd X 强>毫升。这意味着您与其一起发送的每个请求都被视为asynchronous - 或超出&#34;正常&#34;的范围。 HTTP请求。
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