Ruby on Rails:使用params.require()重要吗?

时间:2015-05-14 20:58:38

标签: ruby-on-rails rest

我正在尝试为使用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

但这样安全还是合适?有更正确的方法吗?

为什么用户首先要求,如果这正是我打算创建的?

1 个答案:

答案 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"
}

因为在您的请求中,字段名称为nameaboutkarma

执行params.permit(:name, :karma, :about)的问题在于它阻止你将其他参数传递给动作,因为参数检查器不会允许它们(如果你确实允许它们,那么User.new就会抱怨)。 / p>