복붙노트

[RUBY-ON-RAILS] 중첩 된 PARAMS 해시에 무기 호에 메소드를 호출 피하기 위해 깨끗한 방법이 있나요? [복제]

RUBY-ON-RAILS

중첩 된 PARAMS 해시에 무기 호에 메소드를 호출 피하기 위해 깨끗한 방법이 있나요? [복제]

나는 PARAMS 해시의 중첩 된 '이름'매개 변수를 얻기에 관심이 있어요. 같은 호출

params[:subject][:name]

[: 대상】 비어 PARAMS 때 오류가 발생합니다. 나는 보통 이런 식으로 뭔가를 쓰기이 오류를 방지하려면 :

if params[:subject] && params[:subject][:name]

이를 구현하는 청소기 방법이 있나요?

해결법

  1. ==============================

    1.출몰하고의 아마를 확인합니다. 당신은 크게 코드를 리팩토링 단지 산재 어쩌면 프록시 필요한 경우 필요하지 않습니다 :

    출몰하고의 아마를 확인합니다. 당신은 크게 코드를 리팩토링 단지 산재 어쩌면 프록시 필요한 경우 필요하지 않습니다 :

    params[:subject].maybe[:name]
    

    같은 저자 (raganwald)도 같은 생각으로 썼다 건강에 좋은.

  2. ==============================

    2.하지만 무엇을보고에서, 대신 모델을 할당하고 로직이 배치의 중첩 된 매개 변수를 추출하려고합니다. 당신이 주제 모델이있는 경우, 단순히 할당 :

    하지만 무엇을보고에서, 대신 모델을 할당하고 로직이 배치의 중첩 된 매개 변수를 추출하려고합니다. 당신이 주제 모델이있는 경우, 단순히 할당 :

    @subject = Subject.new(params[:subject])
    

    형태로 채워진 모든 매개 변수 사용자를 추출해야한다. 그런 다음 사용자가 유효한 값을 통과하는지, 그들을 구원하려고합니다.

    ([: 대상】 업데이트 @ subject.attributes = PARAMS와의 내 예에서와 같이)는 사용자가 설정 안 필드에의 액세스에 대해 걱정하는 경우, 다음 질량 과제로 설정하도록 허용해야한다 whoich 필드 attr_accessible 화이트리스트 추가

  3. ==============================

    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. ==============================

    4.PARAMS [주제 :] .try ([] : 이름) 깨끗한 방법

    PARAMS [주제 :] .try ([] : 이름) 깨끗한 방법

  5. ==============================

    5.내가 코딩에 동일한 문제가있을 때, 나는 때때로 '구조'를 사용합니다.

    내가 코딩에 동일한 문제가있을 때, 나는 때때로 '구조'를 사용합니다.

    name = params[:subject][:name] rescue ""
    # => ""
    

    이 좋은 매너 아니지만, 나는 그것이 간단한 방법이라고 생각합니다.

    편집 : 나는 종종 더 이상이 방법은 사용하지 마십시오. 나는 시도하거나 인출하는 것이 좋습니다.

  6. ==============================

    6.정말. 당신은 가져 오거나 (ActiveSupport에서)하려고 시도 할 수 있지만, 그것은 당신이 이미 가지고있는 것보다 훨씬 청소기 아니다.

    정말. 당신은 가져 오거나 (ActiveSupport에서)하려고 시도 할 수 있지만, 그것은 당신이 이미 가지고있는 것보다 훨씬 청소기 아니다.

    더 많은 정보를 원하시면 여기 :

    UPDATE : 및 약 잊어 버렸 :

    건강에 좋은 당신이 할 수 있습니다 :

    params[:user].andand[:name] # nil guard is built-in
    

    마찬가지로 위의 대답은 당 출몰하고 라이브러리에서 어쩌면 사용할 수 있습니다.

  7. ==============================

    7.또는, []를 추가합니다.

    또는, []를 추가합니다.

    class NilClass; def [](*); nil end end
    params[:subject][:name]
    
  8. ==============================

    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. ==============================

    9.나는 여기에 내 대답에서이 게시 교차 :

    나는 여기에 내 대답에서이 게시 교차 :

    [: 일부] [: 필드] 전무가 PARAMS 경우 확인하는 방법?

    나도 더 나은 솔루션을 찾고있다.

    나는 생각 된하자의 사용 중첩 된 키의 존재 세트에 대한 테스트에 다른 방법을 시도 그래서 :

    params[:some].try(:has_key?, :field)
    

    그것은 나쁘지 않아. 이 설정되어 있지 않은 경우 당신은 무 대에 거짓을 얻을. PARAM가 전무로 설정되어있는 경우도 마찬가지 얻을.

  10. ==============================

    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. ==============================

    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. ==============================

    12.당신은 인라인으로 할당 된 이중 해시 액세스를 방지 할 수 있습니다 :

    당신은 인라인으로 할당 된 이중 해시 액세스를 방지 할 수 있습니다 :

    my_param = subj_params = params[:subject] && subj_params[:name]
    
  13. 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