Сильные параметры Rails: разрешить параметр в контроллере

У меня есть модель пользователя, которая в качестве внутреннего поля говорит 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.

Следующее работает, но выглядит немного взломанным

Следующее решает то, что я пытаюсь сделать, но не выглядит очень чистым подходом:

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

Есть ли лучший подход, когда я могу разрешить и установить параметр в методе создания - близко к тому месту, где сохраняется объект?


person Naya Bonbo    schedule 15.09.2015    source источник


Ответы (2)


Просто назначьте свой внутренний параметр вручную, прямо перед сохранением:

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
person Alexey Shein    schedule 15.09.2015

Обычно я добавляю дополнительные атрибуты в параметры после сильного параметра permits:

@user = User.new user_params.merge(some_internal_id: rand(100))
person eirikir    schedule 15.09.2015