我已经尝试过阅读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
答案 0 :(得分:2)
:post
将由Rails翻译为“让我成为一个新的Post对象并使用它构建表单”。
要使用@post
,首先需要在控制器操作中对其进行初始化,即
def new
@post = Post.new
end
您应该使用@post
,因为在渲染表单(设置值,构建关联对象等)之前,您通常最终会想要进行初始化。
如果您想将Post与User(使用current_user)关联,您可以采用多种方式:
实际上,第三种方法是最好的方法。
此外,请始终记住在创建/更新操作中将创建的对象与current_user相关联,因此AFTER用户发送了表单。将user_id作为表单字段显然允许用户更改它!