1

在这个 SO 答案中未定义的方法 `stringify_keys!' ruby on rails,OP 尝试创建一个带有“Honda”字符串的新汽车对象

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

并得到一个字符串化键错误。回答的人说他必须在创建对象时指定表中的列(在本例中为“名称”列),

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”字符串和一个列“winner”作为布尔值。在他的控制器(他设置为使用 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
4

2 回答 2

1

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

Car.new 将始终期望一个哈希。如果你想传递一个值,你需要把它变成一个散列,用一个告诉 Car.new 你传递什么值的键。

于 2013-01-09T00:01:23.637 回答
0

在上一个问题中, params[:car] 是一个字符串。Railsnewcreate方法都需要哈希,这就是为什么代码被修改为传入:name => params[:car]

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

于 2013-01-08T23:59:37.703 回答