实例变量是否从#new通过form_for传递到#create?

时间:2014-06-04 21:12:24

标签: ruby-on-rails

以标准方式创建新博文:

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(我使用嵌套路由)。

3 个答案:

答案 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;保存它。