Rails 4: 在 link_to 帮助程序中设置自定义 redirect_to 远程:true
Rails 4: setup custom redirect_to in link_to helper with remote: true
在我的 Rails 4 应用程序中,我有一个 calendar
和一个 post
模型:一个 calendar
has_many
post
和一个post
belong_to
一个calendar
.
在Calendars#Show
中,我显示属于这个calendar
的所有post
。
在同一个视图中,我使用以下 link 来 update
post
的 approval
自定义属性:
<%= link_to post_path(:id => @post.id, "post[approval]" => "ok"), :method => :patch %>
问题,单击此 link 后,我将转到此 post 的 Posts#Show
视图。
我想要的是保持相同的 Calendars#Show
视图。
我想在控制器的 Posts#Update
操作中实现 redirect_to :back
,但这是不可能的,因为这会在我更新 Posts#Edit
视图时将我重定向到post 来自相同的 Posts#Edit
视图。
所以,我正在寻找一种解决方案,专门为我的 link_to
助手实现 redirect_to,其中 remote: true
从 Calendars#Show
到 Calendars#Show
.
这可能吗?
由于这是一个 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
with remote: true
如果您正在使用 remote
(您的代码片段没有),您不会无论如何重定向:
<%= link_to post_path(:id => @post.id, "post[approval]" => "ok"), :method => :patch, remote :true %>
remote: true
功能调用 ajax,这是对您的服务器的 XML 调用(通过 JS)。由于调用在"scope"之外(IE不是标准"request"),它不会对你当前的浏览器状态造成任何改变,除非你触发他们自己:
#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
from the Calendars#Show
to the Calendars#Show
如果你想刷新你的页面,你可以使用:
#app/views/posts/update.js.erb
window.location.reload(true);
--
为了给你更多的上下文,ajax 代表 asynrhconous javascript and xml。这意味着您发送的每个请求都被认为是 asynchronous —— 或超出 "normal" HTTP 请求的范围。
Ajax 请求 意味着 用于将更改/更新应用于已加载的页面。一个很好的例子是 chat 系统或其他东西。
你关于如何在 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
在我的 Rails 4 应用程序中,我有一个 calendar
和一个 post
模型:一个 calendar
has_many
post
和一个post
belong_to
一个calendar
.
在Calendars#Show
中,我显示属于这个calendar
的所有post
。
在同一个视图中,我使用以下 link 来 update
post
的 approval
自定义属性:
<%= link_to post_path(:id => @post.id, "post[approval]" => "ok"), :method => :patch %>
问题,单击此 link 后,我将转到此 post 的 Posts#Show
视图。
我想要的是保持相同的 Calendars#Show
视图。
我想在控制器的 Posts#Update
操作中实现 redirect_to :back
,但这是不可能的,因为这会在我更新 Posts#Edit
视图时将我重定向到post 来自相同的 Posts#Edit
视图。
所以,我正在寻找一种解决方案,专门为我的 link_to
助手实现 redirect_to,其中 remote: true
从 Calendars#Show
到 Calendars#Show
.
这可能吗?
由于这是一个 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
with
remote: true
如果您正在使用 remote
(您的代码片段没有),您不会无论如何重定向:
<%= link_to post_path(:id => @post.id, "post[approval]" => "ok"), :method => :patch, remote :true %>
remote: true
功能调用 ajax,这是对您的服务器的 XML 调用(通过 JS)。由于调用在"scope"之外(IE不是标准"request"),它不会对你当前的浏览器状态造成任何改变,除非你触发他们自己:
#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
from the
Calendars#Show
to theCalendars#Show
如果你想刷新你的页面,你可以使用:
#app/views/posts/update.js.erb
window.location.reload(true);
--
为了给你更多的上下文,ajax 代表 asynrhconous javascript and xml。这意味着您发送的每个请求都被认为是 asynchronous —— 或超出 "normal" HTTP 请求的范围。
Ajax 请求 意味着 用于将更改/更新应用于已加载的页面。一个很好的例子是 chat 系统或其他东西。
你关于如何在 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