Rails强参数:允许控制器

时间:2015-09-15 21:09:28

标签: ruby-on-rails ruby-on-rails-4 strong-parameters

我有一个用户模型,作为内部字段说some_internal_id。我不希望外部用户能够输入它(通过批量分配)。理想情况下,我不应该在user_params函数中允许它。

理想情况:

Create方法分配内部参数,如下所示:

 def create
    user_params[:some_internal_id] = rand(100)
    @user = User.new(user_params)
    @user.save
 end

 # Never trust parameters from the scary internet, only allow the white list through.
 # No need to permit some_internal_id param here
def user_params
  params.require(:user).permit(:name, :age)
end

上面的代码会引发Unpermitted parameter: some_internal_id错误。

以下作品但看起来有点hacky

以下解决了我想要做的事情,但看起来并不是一个非常干净的方法:

def create
    @user = User.new(user_params)
    @user.save
 end

# Never trust parameters from the scary internet, only allow the white list through.
def user_params
  params[:user][:some_internal_id] = rand(100)
  params.require(:user).permit(:some_internal_id, :name, :age)
end

有没有更好的方法我可以在create方法中允许和设置一个参数 - 靠近保存对象的位置?

2 个答案:

答案 0 :(得分:0)

只需在保存之前手动分配内部参数:

def create
   @user = User.new(user_params)
   @user.some_internal_id = rand(100)
   @user.save
end

要将其写为1调用,您可以使用User.create块语法:

@user = User.create(user_params) do |user| # first, assign these attributes
  user.some_internal_id = rand(100)        # then yield user to the block
end                                        # and, finally, save

答案 1 :(得分:0)

我通常在强参数permit之后将其他属性合并到参数中:

@user = User.new user_params.merge(some_internal_id: rand(100))