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 是多余的,并且在您将其注释掉时有效。不过,这种方式意味着您无法将对象错误传递回新页面上的用户。