web-dev-qa-db-ja.com

Rails 4:属性をパラメータに挿入

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はこの挿入を無視しています。エラーはスローされず、静かに失敗します。

64
nullnullnull

答えを見つけました here 。コントローラーアクション内から属性を挿入するのではなく、マージを使用してparams定義に属性を挿入できます。前の例を拡張するには:

private

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

@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
36
Numbers

この場合の代替として、scopeを介してpass属性を要求できます:

current_user.posts.create(post_params)

3
BitOfUniverse

誰かがRails 5属性ハッシュでネストされた属性を追加/編集する方法を見つけようとしている場合、これは最も簡単な(代替)アプローチであることがわかりました。 mergeまたは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
0
Hollie B.