2014-07-22 5 views
0

메소드의 끝에 bang을 추가하는 레일 규칙은 실패 할 경우 예외를 throw합니다. 하지만 내 경험이 그 행동과 일치하지 않습니다.강타를 추가하면 왜 작품이 만들어 집니까?

대다 관계 (감사 내역) 미국 내 컨트롤러. 관계 오브젝트는 작성할 수 없으며 이벤트를 감사 추적 오브젝트에 게시하여 만 갱신됩니다. 나는 사용자 개체와 내가 관계 바 전화를 겁니다 푸 개체가

(의미합니다 당신은 ... 업데이트하여 작성).

bar=Bar.where(:user_id=>params[:user_id]).where(:foo_id=>params[:foo_id]).first 
    if bar 
     authorize! :update, bar 
    else 
     user=User.find(params[:user_id]) 
     authorize! :bar_create, user 
     foo=Foo.find(params[:foo_id]) 
     bar=Bar.create!(:user_id=>user.id, :foo_id=>foo.id) 
    end 

create 방법이 작동하지 않습니다. 디버깅을했고 bar.save은 정상적으로 작동했지만 create의 전체 내용은 두 번째 호출을 저장하지 않아도되도록하는 것입니다. 나는 실험했고, create!이 잘 작동한다는 것을 발견했다.

편집 : I가 계속 따라

, 나는 create!은하지을 한 사실, 항상 저장할 것을 발견했다. 기본 객체에 오류가 없으며 단지 신비하게 저장되지 않습니다.

나는 create 전화를하고 save 전화를해야했는데 ... 솔직히, 나는 단지 이해하지 못한다.

편집 : 요청에 따라 추가 모델 코드 - 불필요한 방법, 검증 통화 등을 제거하여 관련 진술을 단순화. (이 글을 쓰는 동안, 나는 내가 아직 has_many 추가하지 않은 것으로 나타났습니다 : 호출을 통해,하지만 그 손의 문제와 관련된해야처럼 ...은 보이지 않는다

class User < ActiveRecord::Base 

    has_secure_password 


    has_many :progresses 

end 

class Bar < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :foo 

    has_many :bar_events 

    validates :user, :presence=>true 
    validates :foo, :presence=>true 


    scope :user_id, -> (user_id){ where user_id: user_id} 
    scope :foo_id, -> (foo_id){ where foo_id: foo_id} 
end 

class Foo < ActiveRecord::Base 
end 
+0

'! '의 의미는 Rails에만 해당됩니다. bang 메서드에 대한 Ruby 규칙은 일반적으로 작업이 내부에서 일어난다는 것을 의미합니다. – sevenseacat

+0

@sevenseacat '현재 위치'란 무엇을 의미하며 수정되었습니다. – RonLugge

+0

'gsub'과'gsub! '를 생각해 보면 -'gsub'는 변경된 문자열을 반환 할 것이고'gsub!'는 원래 문자열을 수정할 것입니다. – sevenseacat

답변

0

이 검증 있습니다. . 바 foo 또는 user의 협회 중 하나에서 오류 이상의 해당 개체 검사 시도해보십시오. 터미널에 모든 개체의 오류를 인쇄합니다

bar=Bar.create!(:user_id=>user.id, :foo_id=>foo.id) 
puts bar.errors.inspect, bar.user.errors.inspect, bar.foo.errors.inspect 

rails server을 실행하는 유일한 이유는 저장하지 않을 만들 예정이다 자체 또는 중첩 된 연결의 유효성 검사 오류에 이르기까지.

+0

디버깅을하고 오류를 검사했습니다. 어떤 것도 없었다. 그러므로'save '와'save!'에 대한 호출이 왜 제대로 작동하는지. 어떤 이유로 'create'와 'create!'는 저장해야하는 것은 아니지만 이유를 설명하는 데 오류가 없습니다. – RonLugge

관련 문제