0

例如,我在 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查看?

第二个问题:为什么我必须@post = Post.new在新动作中写?当我评论它时,我也可以创建一个Post. 什么是尊重写在new行动或错过它?

我是 Rails 新手,里面有很多魔法

4

4 回答 4

1

Q1)。这是 RoR 的主要信条之一——约定优于配置。它只是假设,在执行时redirect_to @post,您实际上想要查看@post资源。“读取”资源的标准 REST 操作是show.

但是,如果 - 例如 - 在你看来,你会做类似的事情

<%= link_to @post.title, @post, method: :delete %>

这将产生什么将带您destroy采取行动@post的资源。

拥有这样的约定可以让您编写更少的代码,并且 - 让您开心!

Q2)。如果你提到的有效,我很惊讶。它不应该,因为form_for @post在您的视图中的标签中执行了类似的魔法。如果@post为空,form_for则不应该能够解析要生成的 url,或者一般如何表现 - 取决于Post.new存储在@post它假设您想要create资源,并准备您的<form>标签以使用POST方法提交,但如果在@post那里存储已经持久化的资源,比如说Post.find(1),它将创建<form>要提交的PATCH方法。

再次 - 基于约定,您可以编写更少的代码,实现更多。

我强烈建议不要省略类似@post = Post.new. 它可能会导致难以识别错误,即使它目前对您有用

希望它能澄清事情!

祝你好运!

于 2015-03-04T11:46:22.523 回答
1

第一个问题:它使用该方法将您重定向到显示页面url_for(如果您好奇,可以阅读它的源代码),请记住 @book 有一个 id,因此它采用该 id 并将其包含在/books/:id

第二个问题:当您提交无效表单时,您需要@post,然后@post 将填充错误并显示在new页面上。尝试提交无效帖子,您将收到有关未定义方法的抱怨。

显示无效提交的错误:

<%= form_for :post posts_path do |f| %>

  <% if @post.errors.any? %>

看看我们如何使用上面的@post?只是为了得到其中的错误。

于 2015-03-04T11:49:38.373 回答
1

将记录传递给redirect_tourl 时,将通过调用生成url_for,这将返回该记录的命名 url。为此,它使用类名进行查找。因此,传递 Post 记录将尝试使用post_path带有原始记录的路由作为参数,该参数将在/posts/:id.

于 2015-03-04T11:52:17.457 回答
0

第一个问题

轨道魔法。

当您将 ActiveRecord 对象传递给重定向时,restful 路由会将其解释为您想要转到该对象的显示页面。

在此处使用 redirect_to 的方式有很多。

第二个问题

通常@post = Post.new是必需的,因为您@post在使用 .. 构造时在新操作中将其引用为表单,form_for这对于验证和处理错误很有用。

从技术上讲,您可以在表单中使用form_tag并定义。Post.new这意味着@post = Post.new当您将其注释掉时,它是多余的并且有效。但是,这种方式意味着您无法将对象错误传递回新页面上的用户。

于 2015-03-04T11:57:12.130 回答