[RUBY-ON-RAILS] 중첩 된 PARAMS 해시에 무기 호에 메소드를 호출 피하기 위해 깨끗한 방법이 있나요? [복제]
RUBY-ON-RAILS중첩 된 PARAMS 해시에 무기 호에 메소드를 호출 피하기 위해 깨끗한 방법이 있나요? [복제]
나는 PARAMS 해시의 중첩 된 '이름'매개 변수를 얻기에 관심이 있어요. 같은 호출
params[:subject][:name]
[: 대상】 비어 PARAMS 때 오류가 발생합니다. 나는 보통 이런 식으로 뭔가를 쓰기이 오류를 방지하려면 :
if params[:subject] && params[:subject][:name]
이를 구현하는 청소기 방법이 있나요?
해결법
-
==============================
1.출몰하고의 아마를 확인합니다. 당신은 크게 코드를 리팩토링 단지 산재 어쩌면 프록시 필요한 경우 필요하지 않습니다 :
출몰하고의 아마를 확인합니다. 당신은 크게 코드를 리팩토링 단지 산재 어쩌면 프록시 필요한 경우 필요하지 않습니다 :
params[:subject].maybe[:name]
같은 저자 (raganwald)도 같은 생각으로 썼다 건강에 좋은.
-
==============================
2.하지만 무엇을보고에서, 대신 모델을 할당하고 로직이 배치의 중첩 된 매개 변수를 추출하려고합니다. 당신이 주제 모델이있는 경우, 단순히 할당 :
하지만 무엇을보고에서, 대신 모델을 할당하고 로직이 배치의 중첩 된 매개 변수를 추출하려고합니다. 당신이 주제 모델이있는 경우, 단순히 할당 :
@subject = Subject.new(params[:subject])
형태로 채워진 모든 매개 변수 사용자를 추출해야한다. 그런 다음 사용자가 유효한 값을 통과하는지, 그들을 구원하려고합니다.
([: 대상】 업데이트 @ subject.attributes = PARAMS와의 내 예에서와 같이)는 사용자가 설정 안 필드에의 액세스에 대해 걱정하는 경우, 다음 질량 과제로 설정하도록 허용해야한다 whoich 필드 attr_accessible 화이트리스트 추가
-
==============================
3.루비 2.3.0은 #dig 함께 할이 매우 쉽게
루비 2.3.0은 #dig 함께 할이 매우 쉽게
h = {foo: {bar: {baz: 1}}} h.dig(:foo, :bar, :baz) #=> 1 h.dig(:foo, :zot, :baz) #=> nil
-
==============================
4.PARAMS [주제 :] .try ([] : 이름) 깨끗한 방법
PARAMS [주제 :] .try ([] : 이름) 깨끗한 방법
-
==============================
5.내가 코딩에 동일한 문제가있을 때, 나는 때때로 '구조'를 사용합니다.
내가 코딩에 동일한 문제가있을 때, 나는 때때로 '구조'를 사용합니다.
name = params[:subject][:name] rescue "" # => ""
이 좋은 매너 아니지만, 나는 그것이 간단한 방법이라고 생각합니다.
편집 : 나는 종종 더 이상이 방법은 사용하지 마십시오. 나는 시도하거나 인출하는 것이 좋습니다.
-
==============================
6.정말. 당신은 가져 오거나 (ActiveSupport에서)하려고 시도 할 수 있지만, 그것은 당신이 이미 가지고있는 것보다 훨씬 청소기 아니다.
정말. 당신은 가져 오거나 (ActiveSupport에서)하려고 시도 할 수 있지만, 그것은 당신이 이미 가지고있는 것보다 훨씬 청소기 아니다.
더 많은 정보를 원하시면 여기 :
UPDATE : 및 약 잊어 버렸 :
건강에 좋은 당신이 할 수 있습니다 :
params[:user].andand[:name] # nil guard is built-in
마찬가지로 위의 대답은 당 출몰하고 라이브러리에서 어쩌면 사용할 수 있습니다.
-
==============================
7.또는, []를 추가합니다.
또는, []를 추가합니다.
class NilClass; def [](*); nil end end params[:subject][:name]
-
==============================
8.
class Hash def fetch2(*keys) keys.inject(self) do |hash, key| hash.fetch(key, Hash.new) end end end
EG
require 'minitest/autorun' describe Hash do it "#fetch2" do { yo: :lo }.fetch2(:yo).must_equal :lo { yo: { lo: :mo } }.fetch2(:yo, :lo).must_equal :mo end end
-
==============================
9.나는 여기에 내 대답에서이 게시 교차 :
나는 여기에 내 대답에서이 게시 교차 :
[: 일부] [: 필드] 전무가 PARAMS 경우 확인하는 방법?
나도 더 나은 솔루션을 찾고있다.
나는 생각 된하자의 사용 중첩 된 키의 존재 세트에 대한 테스트에 다른 방법을 시도 그래서 :
params[:some].try(:has_key?, :field)
그것은 나쁘지 않아. 이 설정되어 있지 않은 경우 당신은 무 대에 거짓을 얻을. PARAM가 전무로 설정되어있는 경우도 마찬가지 얻을.
-
==============================
10.난 그냥이 사용 사례에 대한 도티을 썼다 - 먼저 전체 예상 트리가 존재하는지 여부를 모른 채 해시 깊숙이 도달. 구문은 시도 (레일) 아니면 (출몰하고)를 사용하는 것보다 더 간결하다. 예를 들면 :
난 그냥이 사용 사례에 대한 도티을 썼다 - 먼저 전체 예상 트리가 존재하는지 여부를 모른 채 해시 깊숙이 도달. 구문은 시도 (레일) 아니면 (출몰하고)를 사용하는 것보다 더 간결하다. 예를 들면 :
# in a Rails request, assuming `params` contains: { 'person' => { 'email' => 'jon@example.com' } } # there is no 'subject' # standard hash access (symbols will work here # because params is a HashWithIndifferentAccess) params[:person][:email] # => 'jon@example.com' params[:subject][:name] # undefined method `[]' for nil:NilClass # with Dottie Dottie(params)['person.email'] # => 'jon@example.com' Dottie(params)['subject.name'] # => nil # with Dottie's optional class extensions loaded, this is even easier dp = params.dottie dp['person.email'] # => 'jon@example.com' dp['subject.name'] # => nil dp['some.other.deeply.nested.key'] # => nil
https://github.com/nickpearson/dottie : 당신이 더보고 싶은 경우 문서를 확인하세요
-
==============================
11.내가 사용 :
내가 사용 :
params = {:subject => {:name => "Jack", :actions => {:peaceful => "use internet"}}} def extract_params(params, param_chain) param_chain.inject(params){|r,e| r=((r.class.ancestors.include?(Hash)) ? r[e] : nil)} end extract_params(params, [:subject,:name]) extract_params(params, [:subject,:actions,:peaceful]) extract_params(params, [:subject,:actions,:foo,:bar,:baz,:qux])
제공 :
=> "Jack" => "use internet" => nil
-
==============================
12.당신은 인라인으로 할당 된 이중 해시 액세스를 방지 할 수 있습니다 :
당신은 인라인으로 할당 된 이중 해시 액세스를 방지 할 수 있습니다 :
my_param = subj_params = params[:subject] && subj_params[:name]
from https://stackoverflow.com/questions/5429790/is-there-a-clean-way-to-avoid-calling-a-method-on-nil-in-a-nested-params-hash by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 어떻게 특정 마이그레이션을 롤백? (0) | 2020.02.09 |
---|---|
[RUBY-ON-RAILS] 레일의 기본 키를 변경하면 문자열이어야합니다 (0) | 2020.02.09 |
[RUBY-ON-RAILS] 삭제 링크 레일 3보기 대신에 "삭제"의 "가져 오기"전송 (0) | 2020.02.08 |
[RUBY-ON-RAILS] 액티브을 찾을 청소 방법은 지정된 순서대로 id로 객체 (0) | 2020.02.08 |
[RUBY-ON-RAILS] 레일 오류에 루비를 처리하는 방법 : " '보석 액티브 - PostgreSQL의 어댑터를 설치`PostgreSQL의 어댑터를 설치하십시오" (0) | 2020.02.08 |