【问题标题】:How to retrieve all attributes from params without using a nested hash?如何在不使用嵌套哈希的情况下从参数中检索所有属性?
【发布时间】:2012-01-07 07:42:26
【问题描述】:
我目前正在和我的朋友一起制作我的第一个 iPhone 应用程序。他在编写前端代码,而我在 Rails 中编写后端代码。现在的问题是,他试图通过发布请求向我发送必要的属性,但没有使用嵌套哈希,这意味着所有属性都将直接放入 params 而不是“subhash”中。所以更具体地说,我想要做的是能够使用一些 params 方法来检索所有这些属性。我知道默认情况下 params 包含其他对我来说不相关的信息,例如 params[:controller] 等。我将所有属性命名为与模型属性相同,所以我认为应该可以轻松地传递它们,在至少这在 php 中是可能的,所以我有点希望 Rails 也有一个简单的方法来做到这一点。
因此,例如,不是在控制器中使用 User.new(params[:user]),而是在嵌套哈希 params[:user] 中而不是在 params 中直接使用用户属性,所以我怎样才能获得所有这些属性立刻?并将它们放入 User.new() 中?
【问题讨论】:
标签:
ruby-on-rails
ruby
hash
parameters
attributes
【解决方案1】:
我找到了解决问题的方法。我错过了将 attr_accessible 添加到我的模型中,这是当我尝试运行以下代码时最初返回的错误:User.new(params) has been passed multiple attributes with the post request.
解决方案非常简单,也许太简单了,但由于这是我在 Rails 中的第一个真正应用程序,我觉得它可能对其他有类似问题的新手有所帮助。
【解决方案2】:
您可以使用attribute_names 方法从新创建的对象中获取可用属性。所以在这个特殊的例子中:
u = User.create
u.attributes = params.reject { |key,value| !u.attribute_names.include?(key)
u.save
【解决方案3】:
如果您只想将更有限版本的参数传递给 new,您应该能够执行以下操作:
params = { item1: 'value1', item2: 'value2', item3: 'value3' }
params.delete(:item2)
params # will now be {:item1=>"value1", :item3=>"value3"}
除了您在评论中提到的以外,另请参阅this 了解使用说明。 except 的一个例子是这样的:
params.except(:ssn, :controller, :action, :middle_name)