以标准方式创建新博文:
def new
@post = Post.new(post_attr: value)
end
<%= form_for @post do |f| %>
<%= f.text_field %>
<% end %>
提交表单时会调用Posts#create
def create
@post = Post.new(post_params)
@post.save
end
保存的@post
是否仍有post_attr
?
是否有Rails方式让post_attr
穿越并被保存?在我的实际应用程序中,post_attr
是post的parent_id(我使用嵌套路由)。
答案 0 :(得分:1)
当我提交表单时,@ post还会有post_attr吗?
没有
create
操作通常会设置如下所示的实例:
@post = Post.new(params[:post])
属性在params
哈希中设置,该哈希是从客户端发布的请求中包含的数据填充的。如果您在发布的数据中未包含字段,则该字段不会显示在params
。
通过&#34;通过&#34;属性是使用隐藏字段:
<%= form_for @post do |f| %>
<%= f.hidden_field :post_attrs %>
<%= f.text_field %>
<% end %>
发布的值必须像表单上的任何其他字段一样被序列化,因此您无法在此处使用任意方法调用。
答案 1 :(得分:0)
@post的@post是一个新对象,其中包含您从视图中发出的属性。
只要您未对字段视图进行任何更改,此属性将与呈现的位置相同。
答案 2 :(得分:0)
<强> ActiveRecord的强>
@instance variable
不遍历不同的行为(就其本质而言,它是实例变量):
Ruby - 对象有什么功能?对象可以有类和 实例变量。这意味着一个类可以有实例 变量。让我们重新打开我们的Polygon类并添加一个实例 变量:
-
新强>
Rails在操作之间持久保存数据的方式是填充ActiveRecord
对象。当您调用 new
操作时,Rails会使用Model.new
方法创建一个新对象。这实际上创建了一个空对象,然后您可以将其传递给form_for
帮助程序。
form_for
助手拥有该对象后,会呈现所需的fields
。就铁路而言,@instance variable
现在已不复存在。
-
创建强>
当您将数据传递给create
方法时,您正在做的是通过data
哈希发送params
。这意味着当Rails调用create
方法时 - 它将通过该变量(而不是实例var)访问数据
这就是为什么你必须在create
方法中定义另一个变量的原因:
def create
@model = Model.new(model_params)
end
现在区别在于您拥有params
哈希的数据 - 您可以使用它来填充ActiveRecord object
&amp;保存它。