Подтвердить что ты не робот

Rails 4: Вставить атрибут в Params

В Rails 3 появилась возможность вставить атрибут в такие параметры:

params[:post][:user_id] = current_user.id

Я пытаюсь сделать что-то подобное в Rails 4, но не повезло:

post_params[:user_id] = current_user.id

. . . .


private

  def post_params
    params.require(:post).permit(:user_id)
  end

Rails игнорирует эту вставку. Он не вызывает никаких ошибок, он просто терпит неудачу.

4b9b3361

Ответ 1

Нашел ответ здесь. Вместо вставки атрибута из действия контроллера вы можете вставить его в определение параметров с помощью слияния. Чтобы расширить мой предыдущий пример:

private

  def post_params
    params.require(:post).permit(:some_attribute).merge(user_id: current_user.id)
  end

Ответ 2

В дополнение к ответу @timothycommoner вы также можете выполнить слияние для каждого действия:

  def create
    @post = Post.new(post_params.merge(user_id: current_user.id))
    # save the object etc
  end

private
  def post_params
    params.require(:post).permit(:some_attribute)
  end

Ответ 3

В качестве альтернативы для этого случая вы можете получить атрибут pass через scope:

current_user.posts.create(post_params)

Ответ 4

Если кто-то пытается выяснить, как добавить/отредактировать вложенный атрибут в хэше атрибутов Rails 5, я обнаружил, что это наиболее простой (альтернативный) подход. Не беспокойтесь о слиянии или deep_merge... это боль из-за сильных параметров. В этом примере мне нужно было скопировать group_id и vendor_id в соответствующий счет-фактуру (вложенные параметры) перед сохранением.

def create
  my_params = order_params
  @order = Order.new
  @order.attributes = my_params
  @order.invoice.group_id = my_params[:group_id]
  @order.invoice.vendor_id = my_params[:vendor_id]
  @order.save
end

private

# Permit like normal
def order_params
  params.require(:order).permit([:vendor_id, :group_id, :amount, :shipping,:invoice_attributes => [:invoice_number, :invoice_date, :due_date, :vendor_id, :group_id]])
end