Redirect_to 在 Rails 4
Redirect_to in Rails 4
例如,我在 RoR 4 中有一个控制器 PostController 和其中的操作:
def index
@posts = Post.all.order('created_at DESC')
end
def new
@post = Post.new #second question
end
def create
@post = Post.new(post_params)
post.save
redirect_to @post #first question
end
def show
@post = Post.find(params[:id])
end
private
def post_params
params.require(:post).permit(:title, :body)
end
所以,第一个问题是:为什么我们写redirect_to @post
的时候会自动重定向到show/id
? rails 怎么知道它必须转到 show
视图?
第二个问题:为什么我必须在new action中写@post = Post.new
?当我评论它时,我也可以创建一个Post
。在 new
操作中写入或遗漏它是什么?
我是rails的新人,里面有很多魔法
Q1).这是 RoR 的主要信条之一——约定优于配置的一部分。它只是假定,在执行 redirect_to @post
时,您实际上想要查看 @post
资源。 "reading" 资源的标准 REST 操作是 show
。
但是,如果 - 例如 - 在你看来你会做类似的事情
<%= link_to @post.title, @post, method: :delete %>
由此生成的内容会将您带到 @post
资源的 destroy
操作。
拥有这样的约定可以让您编写更少的代码,并且 - 让您开心!
Q2).如果你提到的有效,我很惊讶。它不应该,因为在您的视图中的 form_for @post
标记中执行了类似的魔术。如果 @post
为空,form_for
将无法解析要生成的 url 或一般行为方式 - 取决于存储在 [=12= 中的 Post.new
] 它假设你想要 create
资源,并准备你的 <form>
标签以使用 POST
方法提交,但是如果在 @post
中存储了已经持久化的资源,比如 Post.find(1)
,它将创建要使用 PATCH
方法提交的 <form>
。
再说一次——基于约定,你可以写更少的代码,实现更多。
我强烈建议不要省略类似@post = Post.new
的东西。它可能会导致难以识别错误,即使它目前对您有用
希望它能澄清事情!
祝你好运!
第一个问题:它使用 url_for
方法将您重定向到显示页面(如果您好奇,可以阅读它的来源),请记住@book 有一个 id,所以它使用该 id 并包含它在 /books/:id
的 url 中
第二个问题:当您提交无效表单时需要@post,然后@post 将填充错误并显示在new
页面上。尝试提交一个无效的 post,你会收到关于未定义方法的投诉。
显示无效提交的错误:
<%= form_for :post posts_path do |f| %>
<% if @post.errors.any? %>
看到我们如何使用上面的@post了吗?只是为了得到其中的错误。
将记录传递给 redirect_to
时,将通过调用 url_for
生成 url,这将为该记录 return 命名为 url。为此,它使用 class 名称进行查找。因此传递 Post 记录将尝试使用 post_path
路由并将原始记录作为参数,这将在 /posts/:id
.
中解析
第一题
Rails魔法.
当您将 ActiveRecord 对象传递给重定向时,restful 路由会将其解释为您想要转到该对象的显示页面。
多种不同的使用方式 redirect_to here.
第二题
通常 @post = Post.new
是必需的,因为您在使用 form_for
构建表单时在新操作中引用 @post
.. 对于验证和处理错误很有用。
从技术上讲,您可以使用 form_tag
并在表单中定义 Post.new
。这意味着 @post = Post.new
是多余的,并且在您将其注释掉时有效。不过,这种方式意味着您无法将对象错误传递回新页面上的用户。
例如,我在 RoR 4 中有一个控制器 PostController 和其中的操作:
def index
@posts = Post.all.order('created_at DESC')
end
def new
@post = Post.new #second question
end
def create
@post = Post.new(post_params)
post.save
redirect_to @post #first question
end
def show
@post = Post.find(params[:id])
end
private
def post_params
params.require(:post).permit(:title, :body)
end
所以,第一个问题是:为什么我们写redirect_to @post
的时候会自动重定向到show/id
? rails 怎么知道它必须转到 show
视图?
第二个问题:为什么我必须在new action中写@post = Post.new
?当我评论它时,我也可以创建一个Post
。在 new
操作中写入或遗漏它是什么?
我是rails的新人,里面有很多魔法
Q1).这是 RoR 的主要信条之一——约定优于配置的一部分。它只是假定,在执行 redirect_to @post
时,您实际上想要查看 @post
资源。 "reading" 资源的标准 REST 操作是 show
。
但是,如果 - 例如 - 在你看来你会做类似的事情
<%= link_to @post.title, @post, method: :delete %>
由此生成的内容会将您带到 @post
资源的 destroy
操作。
拥有这样的约定可以让您编写更少的代码,并且 - 让您开心!
Q2).如果你提到的有效,我很惊讶。它不应该,因为在您的视图中的 form_for @post
标记中执行了类似的魔术。如果 @post
为空,form_for
将无法解析要生成的 url 或一般行为方式 - 取决于存储在 [=12= 中的 Post.new
] 它假设你想要 create
资源,并准备你的 <form>
标签以使用 POST
方法提交,但是如果在 @post
中存储了已经持久化的资源,比如 Post.find(1)
,它将创建要使用 PATCH
方法提交的 <form>
。
再说一次——基于约定,你可以写更少的代码,实现更多。
我强烈建议不要省略类似@post = Post.new
的东西。它可能会导致难以识别错误,即使它目前对您有用
希望它能澄清事情!
祝你好运!
第一个问题:它使用 url_for
方法将您重定向到显示页面(如果您好奇,可以阅读它的来源),请记住@book 有一个 id,所以它使用该 id 并包含它在 /books/:id
第二个问题:当您提交无效表单时需要@post,然后@post 将填充错误并显示在new
页面上。尝试提交一个无效的 post,你会收到关于未定义方法的投诉。
显示无效提交的错误:
<%= form_for :post posts_path do |f| %>
<% if @post.errors.any? %>
看到我们如何使用上面的@post了吗?只是为了得到其中的错误。
将记录传递给 redirect_to
时,将通过调用 url_for
生成 url,这将为该记录 return 命名为 url。为此,它使用 class 名称进行查找。因此传递 Post 记录将尝试使用 post_path
路由并将原始记录作为参数,这将在 /posts/:id
.
第一题
Rails魔法.
当您将 ActiveRecord 对象传递给重定向时,restful 路由会将其解释为您想要转到该对象的显示页面。
多种不同的使用方式 redirect_to here.
第二题
通常 @post = Post.new
是必需的,因为您在使用 form_for
构建表单时在新操作中引用 @post
.. 对于验证和处理错误很有用。
从技术上讲,您可以使用 form_tag
并在表单中定义 Post.new
。这意味着 @post = Post.new
是多余的,并且在您将其注释掉时有效。不过,这种方式意味着您无法将对象错误传递回新页面上的用户。