在这个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
答案 0 :(得分:1)
这完全取决于params[:car]
包含的内容。在Railscast示例中,params[:car]
是一个包含两个条目(name
和winner
)的哈希。在另一个SO问题中,params[:car]
看起来像是一个包含汽车名称的字符串。
Car.new总是期待哈希。如果你想传递一个值,你需要将它变成一个哈希,其中一个键告诉Car.new你正在传递什么值。
答案 1 :(得分:0)
在上一个问题中,params [:car]是一个字符串。 Rails的new
和create
方法都期望哈希值,这就是为什么代码被更改为传入:name => params[:car]
如果使用Rails的form_for来构造表单,params [:model_name]将具有一个匹配模型属性的哈希值。在这种情况下,不需要自定义工作,只需使用params [:model_name]初始化模型就可以正常工作。