복붙노트

[RUBY-ON-RAILS] 저장하지 않고 update_attributes 레일?

RUBY-ON-RAILS

저장하지 않고 update_attributes 레일?

기록을 저장하지 않습니다 update_attributes에 대한 대안이 있습니까?

내가 뭔가를 같이 할 수 있도록 :

@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save

BTW, 난 내가 한 줄에 모두 업데이트 할 @ car.model = '시에라'할 수 있지만, 알고있다.

해결법

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

    1.나는 당신을 위해 무엇을 찾고있는 것은 assign_attributes 믿습니다.

    나는 당신을 위해 무엇을 찾고있는 것은 assign_attributes 믿습니다.

    그것은 기본적으로 update_attributes와 동일합니다하지만 기록을 저장하지 않습니다 :

    class User < ActiveRecord::Base
      attr_accessible :name
      attr_accessible :name, :is_admin, :as => :admin
    end
    
    user = User.new
    user.assign_attributes({ :name => 'Josh', :is_admin => true }) # Raises an ActiveModel::MassAssignmentSecurity::Error
    user.assign_attributes({ :name => 'Bob'})
    user.name        # => "Bob"
    user.is_admin?   # => false
    user.new_record? # => true
    
  2. ==============================

    2.당신은 assign_attributes 또는 속성을 사용할 수 = (그들은 같은 것)

    당신은 assign_attributes 또는 속성을 사용할 수 = (그들은 같은 것)

    (레일 6) 업데이트 방법 치트 시트 :

    출처: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment.rb

    또 다른 치트 시트 : http://www.davidverhasselt.com/set-attributes-in-activerecord/#cheat-sheet

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

    3.당신은 '속성'방법을 사용할 수 있습니다 :

    당신은 '속성'방법을 사용할 수 있습니다 :

    @car.attributes = {:model => 'Sierra', :years => '1990', :looks => 'Sexy'}
    

    출처 : http://api.rubyonrails.org/classes/ActiveRecord/Base.html

    속성 = (new_attributes, guard_protected_attributes = TRUE) 당신은 속성 이름을 (다시 열 이름과 일치하는) 일치하는 키 해시를 전달하여 한 번에 모든 속성을 설정할 수 있습니다.

    guard_protected_attributes가 true (디폴트)의 경우, 민감한 속성은 attr_protected 매크로를 사용하여 대량 할당이 양식으로부터 보호 할 수 있습니다. 또는 당신은 대안으로 attr_accessible 매크로를 액세스 할 수있는 속성을 지정할 수 있습니다. 그런 다음에 포함되지 않은 모든 속성은 대량 할당으로 허용되지 않습니다.

    class User < ActiveRecord::Base
      attr_protected :is_admin
    end
    
    user = User.new
    user.attributes = { :username => 'Phusion', :is_admin => true }
    user.username   # => "Phusion"
    user.is_admin?  # => false
    
    user.send(:attributes=, { :username => 'Phusion', :is_admin => true }, false)
    user.is_admin?  # => true
    
  4. ==============================

    4.사용 중 하나 assign_attributes 또는 속성 = 방법을 저장하지 않고 액티브 모델 값의 질량 지정하십시오. 이러한 방법은 레일 3 및 최신에서 사용할 수 있습니다. 그러나주의해야 할 약간의 차이 및 버전 관련 망 가지고있다.

    사용 중 하나 assign_attributes 또는 속성 = 방법을 저장하지 않고 액티브 모델 값의 질량 지정하십시오. 이러한 방법은 레일 3 및 최신에서 사용할 수 있습니다. 그러나주의해야 할 약간의 차이 및 버전 관련 망 가지고있다.

    두 가지 방법이 사용에 따라 :

    @user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
    
    @user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
    

    어느 방법이 검증을 수행하거나 콜백을 실행하는 것에주의; 저장 호출 할 때 콜백 및 검증이 발생합니다.

    레일 3. 속성에서 assign_attributes의 속성 = 약간 다릅니다은 = 전달 된 인수가 해시이며, 즉시 반환, 그렇지 않은 경우는 것을 확인합니다; assign_attributes는 그러한 해시 검사가 없습니다. = 속성에 대한 액티브 속성 할당 API 설명서를 참조하십시오.

    다음 유효하지 않은 코드는 자동으로 단순히 속성을 설정하지 않고 반환하여 실패합니다 :

    @user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
    

    할당이 이루어 것처럼 =이 자동으로 작동합니다 속성을 성공적으로 할 때 정말, 그들은하지 않았다.

    assign_attributes의 시도는 바깥 쪽 배열의 해시 키를 캐릭터 라인 화 할 때 유효하지 않은 코드는 예외를 발생합니다 :

    @user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
    

    assign_attributes 첫번째 인수 해시 아니라는 것을 나타내는 stringify_keys NoMethodError 대한 예외를 발생한다. 예외 자체는 실제 원인에 대해 매우 유익한 것이 아니라 예외가 발생한다는 사실은 매우 중요하다.

    이러한 경우의 유일한 차이점은 질량 할당을 위해 사용 된 방법이다 : 속성 = 자동 성공하고 assign_attributes 오류가 발생했음을 알리기 위해 예외를 제기한다.

    이러한 예는 인위적인 보일 수 그들은 정도이지만 최종 .MAP 여기서 상기 결과는 API에서 데이터를 변환하거나 단지 데이터 변환의 시리즈를 사용하여 해시 잊는 경우 오류 유형이 발생하기 쉬운 . 몇 가지 코드를 귀하의 속성 할당에서 제거 위의 50 개 라인과 3 개 기능을 유지, 당신은 실패에 대한 조리법을 가지고있다.

    레일 3 교훈은 이것이다 : 항상 대신 속성 =의 assign_attributes를 사용합니다.

    레일 4, 속성에서 = 단순히 assign_attributes에 대한 별칭입니다. = 속성에 대한 액티브 속성 할당 API 설명서를 참조하십시오.

    레일 (4)에 어느 방법이 상호 교환 적으로 사용될 수있다. 오류 ArgumentError : 실패는 첫 번째 인수는 매우 도움이 예외가 발생합니다 같은 해시를 전달하는 속성을 할당 할 때, 당신은 인수로 해시를 통과해야합니다.

    만약 당신이있는 거 사전 광고 게재, 당신은뿐만 아니라, 저장하기 전에 검증에 관심이있을 수 선방에 준비 할당합니다. 당신은 유효을 사용할 수 있습니까? 무효? 이 방법. 두 부울 값을 반환합니다. 유효한? 그렇지 않은 경우 저장되지 않은 모델은 모든 검증 또는 false를 통과하면 true를 반환합니다. 무효? 단순히 유효한의 역인가?

    유효한? 이처럼 사용할 수 있습니다 :

    @user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
    

    이것은 당신에게 save ()를 호출하기에 앞서 어떤 검증 문제를 처리 할 수있는 능력을 제공 할 것입니다.

  5. from https://stackoverflow.com/questions/6770350/rails-update-attributes-without-save by cc-by-sa and MIT license