params [:something]からフィールドを削除する方法


116

ユーザーモデルのフォームである私の登録フォームは、会社の文字列値を取ります。ただし、ユーザーが企業に所属するように変更しました。したがって、CompanyのオブジェクトをUsersモデルに渡す必要があります。

Companyのオブジェクトを取得するためにフォームから文字列値を使用したいのですが。

@user.company = Company.find_by_name(params[:company])

上記はうまくいくと思いますが、私が呼び出すと、フォームは:company(文字列)をモデルに渡します。

@user = User.new(params[:user])

したがって、:companyパラメータをUserモデルに渡す前に削除する方法を知りたい(その方法がわからない)のです。

回答:


209

Rails 4/5-編集された回答 (コメントを参照)

この質問が書かれたので、新しいバージョンのRailsが抽出を追加しましたそして除く外例えば:

new_params = params.except[the one I wish to remove]

これは、パラメーターに渡された元のパラメーターを破棄せずに、コピーに必要なすべてのパラメーターを「取得」するためのより安全な方法です(これは、コードのデバッグとメンテナンスが時間の経過とともに非常に困難になるため、実行することをお勧めしません)。

または、コピーせずに直接渡すこともできます:

@person.update(params[:person].except(:admin))

extract!もっと注意して使用してオリジナルを変更します(!ビッグバン演算子を持っています)!

元の回答

次のコマンドを使用して、ハッシュからキーと値のペアを削除できますHash#delete

params.delete :company

params [:user]に含まれている場合は、次のようにします。

params[:user].delete :company

16
Rails 4.0を使用していますが、機能しmodel_params.delete :key_nameません。理由は何ですか?
Zorayr 2013年

13
paramsハッシュからの削除は非常に悪い考えです。デバッグ中などで人々を混乱させます...属性を割り当てるために渡すカスタムハッシュを使用しますassin_params = params.dup.delete(:company)。paramsから直接削除しないでください
ドミニクゴルターマン2013年

4
意味assign_params = params.dup; assign_params.delete(:company)
ドミニクゴルターマン2013年

12
@Zorayr同じ問題がありました。私にとっては、私model_paramsが関数であり、関連するパラメータをから引き出したためparamsです。だから、ときdeleteからmodel_params、あなたは本当にただことをハッシュから削除しているmodel_params戻ります。
Lucy Bain

1
user_paramsはメソッドであるため、user_params.delete(:this_param)を実行すると、正しいハッシュが計算されますが、その後のuser_paramsの呼び出しでは、ハッシュが最初から再計算されます。これが@Gaulが悪い考えだと言った理由です。Rails 5では、params.exceptメソッドと抽出も使用できるようになりました。
rmcsharry

89

おそらくhash.exceptを使用する必要があります

class MyController < ApplicationController
  def explore_session_params
    params[:explore_session].except(:account_id, :creator)
  end
end

これは2つのことを実行します。一度に複数のキーを除外できるようにし、元のハッシュを変更しません。


Rails 4 ActionController :: Parametersはハッシュを継承しているので、exceptまたはextract!Rails 5では機能しますが、exceptとextractがあります!ActionController :: Parameters自体で定義されたメソッド
kangkyu 2016年

私は実際にこのハッシュパラメータをUPDATEメソッドに持っています。"-1"キーを持っている人以外はどうすればいいの?{"utf8" => "✓"、 "_method" => "patch"、 "authenticity_token" => "VtY ..."、 "brochure" => {"title" => "Hello world"、 "profilings_attributes" => {"-1" => {"member_profile_id" => "3"}、 "0" => {"percentage" => "10.0"、 "description" => "Some description!"、 "_destroy" = > "false"、 "id" => "10"}、 "1" => {...}}、 "sponsorings_attributes" => {"-1" => {"sponsor_id" => "2"}、 "0" => {"brochure_id" => "

2

これを実現する正しい方法は、 strong_params

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
  end

  private

  def user_params
    params.require(:user).permit(:name, :age)
  end
end

これにより、モデルに渡すパラメーターをより詳細に制御できます


1
respond_to do |format|
  if params[:company].present?
    format.html { redirect_to(:controller => :shopping, :action => :index) }
  else
    format.html
  end
end

これにより、URLからパラメータが削除されます


0

削除できるようにするには、メモを作成できます。

def parameters
  @parameters ||= params.require(:root).permit(:foo, :bar)
end

今あなたはできる:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.