params [: something]에서 필드를 제거하는 방법


116

사용자 모델의 양식 인 내 등록 양식은 회사의 문자열 값을 사용합니다. 하지만 사용자가 회사에 속하도록 변경했습니다. 따라서 Company의 개체를 Users 모델에 전달해야합니다.

양식의 문자열 값을 사용하여 Company의 개체를 얻고 싶습니다.

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

위의 내용이 작동한다고 믿지만 호출 할 때 양식은 : company (문자열)를 모델에 전달합니다.

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

따라서 User 모델에 전달하기 전에 : company 매개 변수를 제거하는 방법을 알고 싶습니다 (방법을 찾을 수 없습니다).

답변:


209

Rails 4/5-수정 된 답변 (댓글 참조)

이 질문이 작성된 이후 Rails의 최신 버전이 추출 을 추가했습니다 ! 그리고 예를 제외하고 :

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

이것은 params에 전달 된 원본을 파괴하지 않고 필요한 모든 매개 변수를 사본으로 '잡는'더 안전한 방법입니다 (시간이 지남에 따라 코드의 디버깅 및 유지 관리를 매우 어렵게 만들기 때문에 좋은 일이 아닙니다).

또는 복사하지 않고 직접 전달할 수 있습니다. 예 :

@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)시킵니다. ... 속성을 할당하기 위해 전달하는 사용자 정의 해시를 사용 합니다 ( 예 : use . 매개 변수에서 직접 삭제하지 마십시오
Dominik Goltermann 2013

4
내 말은assign_params = params.dup; assign_params.delete(:company)
Dominik Goltermann

12
@Zorayr 나는 같은 문제가 있었다. 나를 위해 그것은 model_params관련 매개 변수를 params. 당신 그래서 delete에서 model_params당신이 정말 해시 그에서 삭제하고 model_params돌아갑니다.
Lucy Bain 2014 년

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

두 가지 작업을 수행합니다. 한 번에 둘 이상의 키를 제외 할 수 있으며 원래 해시를 수정하지 않습니다.


Rails 4 ActionController :: Parameters는 Hash를 상속 했으므로 제외하거나 추출하십시오! 작동합니다, Rails 5에서는 예외 와 추출이 있습니다! ActionController에 정의 된 방법 :: 매개 변수 자체
kangkyu

실제로 UPDATE 메서드에이 해시 매개 변수가 있습니다. "-1"열쇠 로 가진 사람을 제외하고 어떻게 할 수 있습니까 ? { "utf8"=> "✓", "_method"=> "patch", "authenticity_token"=> "VtY ...", "brochure"=> { "title"=> "Hello world", "profilings_attributes" => { "-1"=> { "member_profile_id"=> "3"}, "0"=> { "percentage"=> "10.0", "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.