何时使用属性哈希

时间:2013-01-08 23:54:10

标签: ruby-on-rails

在这个SO回答undefined method `stringify_keys!' ruby on rails中,OP试图创建一个带有“Honda”字符串的新车对象

 @car = Car.new(params[:car])

并且遇到了stringify键错误。回答的人说他必须在创建对象时从表中指定列(在本例中为'name'列),

create expects to get an attributes hash and to stringify it's keys for the column names.

If you have a column named name in your cars table then try this:

@car = Car.new(:name => params[:car])

但是,我正在观看一个RailsCast,其中Rbates创建一个带有'name'字符串和一个'wins'列作为布尔值的条目表。在他的控制器中(他设置用json响应),他不使用属性哈希。他的创造行动

   def create
     respond_with Entry.create(params[:entry])
   end

为什么Rbates不必使用属性哈希,如果可以的话,哈希的属性是什么样的呢?像这样的东西?在ryans案例中,您是否必须为每一列命名:name和:winner?

   def create
     respond_with Entry.create(:name => params[:entry][:name], :winner => params[:entry]     [:winner]
   end

2 个答案:

答案 0 :(得分:1)

这完全取决于params[:car]包含的内容。在Railscast示例中,params[:car]是一个包含两个条目(namewinner)的哈希。在另一个SO问题中,params[:car]看起来像是一个包含汽车名称的字符串。

Car.new总是期待哈希。如果你想传递一个值,你需要将它变成一个哈希,其中一个键告诉Car.new你正在传递什么值。

答案 1 :(得分:0)

在上一个问题中,params [:car]是一个字符串。 Rails的newcreate方法都期望哈希值,这就是为什么代码被更改为传入:name => params[:car]

如果使用Rails的form_for来构造表单,params [:model_name]将具有一个匹配模型属性的哈希值。在这种情况下,不需要自定义工作,只需使用params [:model_name]初始化模型就可以正常工作。