我正在尝试为使用Ruby on Rails创建的非常简单的Web应用程序创建RESTful API。具体来说,我尝试实施POST /users.json
来创建新用户。
" 解析对JSON的响应"位由脚手架处理。当试图使用scaffolded的强参数方法时会出现问题。
我使用Postman Chrome扩展程序发出POST请求:
# POST /users
# POST /users.json
def create
user_params[:karma] = 1
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
因此user_params
被调用,而需要用户(请注意此方法是由脚手架生成的):
def user_params
params.require(:user).permit(:name, :karma, :about)
end
我意识到我可以通过简单的#34; 不需要"来解决这个问题。用户参数:
def user_params
params.permit(:name, :karma, :about)
end
但这样安全还是合适?有更正确的方法吗?
为什么用户首先要求,如果这正是我打算创建的?
答案 0 :(得分:1)
params.require(:user).permit(:name, :karma, :about)
说params散列必须包含一个名为user的密钥,并检查相关值是否只包含指定的密钥。除了这个安全检查,它几乎返回params[:user]
。这要求params哈希的形式为
{
:user => {
:name => "Bob",
:about => "Professional builder",
:karma => "10"
}
}
如果表单/ http请求中的字段名称为user[name]
,user[about]
,您将获得这样的参数哈希值,这正是您使用rails表单助手时所获得的
另一方面,它听起来像你发送的参数哈希
{
:name => "Bob",
:about => "Professional builder",
:karma => "10"
}
因为在您的请求中,字段名称为name
,about
,karma
。
执行params.permit(:name, :karma, :about)
的问题在于它阻止你将其他参数传递给动作,因为参数检查器不会允许它们(如果你确实允许它们,那么User.new就会抱怨)。 / p>