这可能是一个真正的n00b问题,但是如果你的params列表包含一堆不属于可访问属性的东西,即
params = {"controller"=>"api1/users", "action"=>"create"}
什么是“消毒”你的参数的最佳方法,以便它们只包含可访问的属性。我当前想到的当前方式是:
User._accessible_attributes[:default].entries
给我一个可访问属性列表,然后只传递这些参数:
["", "email", "password", "fb_token", "fb_id", "fb_name", "first_name", "last_name", "gender"
另一种可能的方法是:
def clean_params #ANTIPATTERN
params.delete(:controller)
params.delete(:action)
end
但这也像反模式......
我知道你应该做一些像params [:user]这样的东西来获取只有可访问的params,但是因为这是一个API,所以能够在url中传递内容会很好。
谢谢!
答案 0 :(得分:2)
你可以这样做......这只会在控制器中你想要的参数中感知到。信用:dhh's gist
class UserController < ApplicationController
respond_to :html
def create
respond_with User.create(user_params)
end
private
def user_params
params[:user].slice(:email, :first_name, :last_name)
end
end
答案 1 :(得分:2)
Rails参数包装器会自动为您执行此操作。也就是说,它会接受顶级参数并将它们分组,例如:user
以方便您使用,过滤掉用户模型无法访问的任何参数。在内部它使用accessible_attributes
,类似于你所做的。使用您的API的人不需要对属性进行分组 - rails会在将params交给您的控制器操作之前执行此操作。
默认情况下,它已针对JSON请求启用,但您可以通过编辑initializers/wrap_parameters.rb
来扩展它。或者,您可以使用控制器中的wrap_parameters
method在每个控制器的基础上调整行为。
参数消毒的轨道方案可能会在4.0中发生变化,趋向于远离模型并朝向控制器。您可能希望观看strong_parameters gem的开发,这可能是对未来事物的预览。