메소드의 끝에 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!
이 잘 작동한다는 것을 발견했다.
, 나는 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
'! '의 의미는 Rails에만 해당됩니다. bang 메서드에 대한 Ruby 규칙은 일반적으로 작업이 내부에서 일어난다는 것을 의미합니다. – sevenseacat
@sevenseacat '현재 위치'란 무엇을 의미하며 수정되었습니다. – RonLugge
'gsub'과'gsub! '를 생각해 보면 -'gsub'는 변경된 문자열을 반환 할 것이고'gsub!'는 원래 문자열을 수정할 것입니다. – sevenseacat