1

레일스 5 앱에 사용자, 제안 및 잠재적 모델이 있습니다.레일 5 - 상위 컨트롤러의 편집 경로에서 특정 인스턴스를 제외합니다.

사용자는 자신과 다른 사람들이 의견을 작성할 수있는 제안서를 만듭니다. 모델 사이

연관성은 다음과 같습니다

사용자

has_many :proposals, dependent: :destroy 
    has_many :potentials 

내 루트 파일에서

belongs_to :proposal, inverse_of: :potentials 
    belongs_to :user 

belongs_to :user 
has_many :potentials, inverse_of: :proposal 
    accepts_nested_attributes_for :potentials, reject_if: :all_blank, allow_destroy: true 

잠재적 인 제안, 나는 강력한 두 가지 자원을 가지고 ials. 나는이 비트로 piste를 벗어 났는지 확신 할 수 없다. 그렇지 않으면 어떻게해야하는지에 대한 예를 찾을 수 없다. 둘 다 있습니다

resources :potentials 

뿐만 아니라 :

resources :proposals do 

    resources :potentials 

나는이 사용자가 제안서를 만들 때, 그들은 중첩 된 필드 잠재적 인 속성을 추가 형성 사용할 수 있도록이다했던 이유 . 다른 사용자가 해당 제안을 볼 때 새로운 양식을 추가하여 잠재적 속성 집합을 추가합니다 (제안서 양식을 통해 수행하지 않음).

내 잠재력보기 폴더에는 제안서 양식에 포함 된 potential_fields_for뿐만 아니라 양식을 렌더링하는 새로운보기가 있습니다 (제안 작성자 만 중첩 된 필드를 사용할 수 있음).

새를/렌더링 형태가있다 :

<%= simple_form_for [ @proposal, @potential ] do |f| %> 
f 

제안 양식이 있습니다 내 제안 컨트롤러에서

<%= f.simple_fields_for :potentials do |f| %> 
     <%= f.error_notification %> 
      <%= render 'potentials/potential_fields', f: f %> 

     <% end %> 


     <%= link_to_add_association 'Add another novel aspect', f, :potentials, partial: 'potentials/potential_fields' %> 
     </div> 

, 내가 만든 타사을 제외 할 수있는 방법을 찾기 위해 노력하고있어 잠재력을 제안서 양식에 표시된 입력란에서

def edit 
    @proposal.potentials_build unless @proposal.potentials || @proposal.potential.user_id != current_user.id 

나는 제안 작성자가 제안 양식에서 해당 필드를 편집 할 수 있지만, 내가 그들을 터치하지 않는 경우에도, 제 3 자 잠재력의 사용자 ID가 제안 작성자에게 업데이트되는 수 없도록하려면 ID (해당 타사 잠재 속성을 업데이트하지 않고) 제안서 양식을 업데이트 할 때

제안 컨트롤러에서 현재 사용자 ID가 아닌 사용자가 만든 잠재력을 배제하여 편집 작업을 변경하려고했습니다. 제안서 작성자 만 제안서를 수정할 수 있으므로 proposal.user_id가 아닌 다른 사용자 ID를 가진 proposal.potential의 인스턴스는 제외됩니다.

그게 효과가 없습니다.

제안서 작성자가 작성하지 않은 잠재적 인 인스턴스에만 제안서 편집 조치를 제한 할 수있는 방법이 있습니까?

타린의 제안

나는 이것에 대해 타린의 생각을 채택했습니다.

scope :owner_potentials, ->{ where(user_id: potential.user_id) } 
    scope :third_party_potentials, ->{ where(user_id: != potential.user_id) } 

나는이 범위를 작성하는 올바른 방법이라고 확신하지 않다 : 내 proposal.rb에서

, 나는이 개 범위를했다. 내가으로이 방법을 시도

scope :owner_potentials, ->(user){ where(user_id: potential.user_id) } 
     scope :third_party_potentials, ->(user){ where(user_id: != potential.user_id) } 

: 내가 그들을 구성하는 방법을 배우고 시도 할 때 나는 이전의 경우에이를 작성하는 방법에 대한 참조를 찾을 수 없습니다 있지만,이 형식으로 제시하는 조언을받은 글쎄,하지만 "(사용자)"를 포함하지 않으면 내가하는 것과 같은 오류가 발생합니다. 나는 그 포함이 무엇을하는지 이해할 수 없다.

# @proposal.potentials_build unless @proposal.potentials || @proposal.potential.user_id != current_user.id 
     # @proposal.owner_potentials.build unless @proposal.owner_potentials 
     #@potentials = @proposal.owner_potentials || @proposal.owner_potentials.build 

첫 번째는 내 원래의 시도였다 : 나의 제안 컨트롤러, 편집 작업에

, 나는 다음의 각을 시도했습니다. 그것은 일을 didnt하고이 포스트를 쓰게했다.

둘째는 내가 작성해야한다고 생각하는 방식입니다.

세 번째는 Taryn의 아이디어를 직접 작성하여 작성해야하는 방식인지 확인하는 것입니다. (나는 일반적인 방법으로 무엇을해야하는지 더 자세히 설명합니다.)

이 모든 작업을 수행 할 수 없습니다.

NoMethodError at /proposals/17/edit 
undefined method `owner_potentials' for #<Proposal:0x007f84f6ca1700> 

내가 이러면 작업은 범위가 테이블로 클래스에서 실행되는 이유를 생각하지 특정 인스턴스 :이 시도의 두번째 버전의 경우는 말한다 오류가 편집 할 수 있습니다. 나는 그것이 this post이 그것을 설명한다고 생각한다.

제안서에는 많은 잠재력이 있으므로 특정 제안서에 속한 모든 잠재력을 확인하여 제안서 인스턴스의 사용자 ID와 동일한 사용자 ID를 가진 잠재력이 있는지 확인하는 것이 좋습니다. 어떻게해야합니까? set_proposal 방법에 적용하는 편집을위한 올바른 제안을 따기 때문에 제안 컨트롤러 편집 작업에

Proposal.owner_potentials.build unless Proposal.owner_potentials 

:

나는 쓰기를 기운 다.

범위에서 테스트중인 has_many 관계가있는 컨트롤러 편집 작업에서 범위를 사용할 수 있습니까?

다음 시도

나의 다음 생각은 범위는 클래스에서 실행할 수 있도록 잠재적 인 모델의 범위를 정의하는 것입니다.인 (하지만 방법은 내가 그들을 쓰는 것으로 나타났다 -

scope :owner_potentials, ->{ where('user_id == potential.proposal.user_id') } 
    scope :third_party_potentials, ->{ where('user_id != potential.proposal.user_id') } 

내가 범위 및 해당 세션에서 내 테이크 아웃 내가 위에서 사용 된 잘못된 구문입니다을 배우려고 노력 codementor에 시간을 보냈다 :

나는 시도 게시물의 맨 위에는 정의되지 않은 변수에 오류가 있습니다). 나는 어떻게 스코어를 쓰는 법을 배우는지를 모른다.

어쨌든 - 다음 나는 내 제안 컨트롤러에서 편집 작업을 변경 시도 :이 저장하고 그것을 시도 할 때

@proposal.potentials.owner_potentials.build unless @proposal.potentials.owner_potentials 

지금, 나는 오류를 얻을 수 없지만, 내가 제안을 편집하려고 할 때, I 제 3자가 만든 잠재력을 편집 할 수 있습니다. 나는 범위를 효과적으로 쓰지 않는지 또는이 솔루션이 다른 이유로 작동하지 않을지 이해하지 못합니다.

답변

1

나는 소유자/소유자가 아닌 다른 사람이 만든 잠재력에 잠재력을 제한하는 사용자 정의 범위 지정 연결 (예 : owners_potentials/third_party_potentials)을 추가하는 것을 고려할 것입니다. 그런 다음 필요할 때마다이 범위를 사용할 수 있습니다.

예를 들어

has_many :potentials, inverse_of: :proposal 
has_many :owner_potentials, ->{ where("potentials.user_id = proposals.creator_id") } 
has_many :third_party_potentials, ->{ where("potentials.user_id != proposals.creator_id") } 

그럼 당신은 같은 것을 할 수있는 :

<%= f.simple_fields_for @potentials do |f| %> 

참고 : 지정한 하나를 사용하는 방법에 대한 구체적, 형태 그리고

def edit 
    @potentials = @proposal.owner_potentials || @proposal.owner_potentials.build 

을 : 코드가 테스트되지 않았거나 온전한 체크가되지 않았다면 할 수있는 일에 대한 아이디어를 제공하는 것입니다. 동창 일은 독자를위한 운동으로 남겨진다;)

+0

고맙습니다 Taryn. – Mel

+0

컨트롤러에서 스코프를 사용할 수 있습니까? – Mel

+0

모델에서 스코프를 정의하면 모델을 가지고있는 스코프를 어디서나 사용할 수 있습니다 ... –