@post和:post在form_for之间的区别是什么?

时间:2014-04-11 22:51:56

标签: ruby-on-rails instance-variables form-for

我已经尝试过阅读form_for Ruby doc,但仍然很难理解差异。

加载new.html.erb视图时,:post有效,而@post却没有。这是相关的视图和控制器:

This is Post's new.html.erb
<%= form_for(:post) do |f| %>
    <%= f.text_area :note, value: "Say something" %><br>
    <%= f.submit "Post" %>
<% end %>

PostController中:

class PostsController < ApplicationController
    before_action :signed_in_user, only: [:new, :create]

    def index
        @posts = Post.all
    end

    def new
    end

    def create
        @post = current_user.posts.build
        puts "This is #{@post.user_id} user"
        redirect_to posts_path if @post.save #post/index.html.erb
    end

    def destroy
    end

    private

    def signed_in_user
        redirect_to signout_path, notice: "Please sign in." unless signed_in?
    end
end

1 个答案:

答案 0 :(得分:2)

:post将由Rails翻译为“让我成为一个新的Post对象并使用它构建表单”。 要使用@post,首先需要在控制器操作中对其进行初始化,即

def new
  @post = Post.new
end

您应该使用@post,因为在渲染表单(设置值,构建关联对象等)之前,您通常最终会想要进行初始化。

如果您想将Post与User(使用current_user)关联,您可以采用多种方式:

  1. @ post.user_id = current_user.id
  2. @ post.user = current_user
  3. @post = current_user.posts.build(params ...)
  4. 实际上,第三种方法是最好的方法。

    此外,请始终记住在创建/更新操作中将创建的对象与current_user相关联,因此AFTER用户发送了表单。将user_id作为表单字段显然允许用户更改它!