1

Rails 5アプリに、ユーザー、プロポーザル、および潜在的なモデルがあります。Rails 5 - 親コントローラの編集パスから特定のインスタンスを除外する

ユーザーは自分自身と他のユーザーがコメントを作成できるプロポーザルを作成します。モデル間の

団体は次のとおりです。

ユーザー

has_many :proposals, dependent: :destroy 
    has_many :potentials 

私のroutesファイルで

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 

潜在的な提案、私は強力ための2つのリソースを持っていますials。私はこのビットでピストを外したかどうかはわかりません。そうでなければこれを行う方法の例を見つけることはできません。私は両方している:

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> 

、私が作成したサードパーティを除外するための方法を見つけようとしている:ポテンシャルをプロポーザルフォームに表示されているフィールドから私は提案の作成者が提案フォームからこれらのフィールドを編集できるようにしたくないが、私はそれらに触れていない場合でも、サードパーティの可能性に関するユーザーIDが提案作成者に更新さ

def edit 
    @proposal.potentials_build unless @proposal.potentials || @proposal.potential.user_id != current_user.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で

は、私が2つのスコープを作りました。私はそれらを書く方法への参照を見つける傾けるが、私はそれらを構成する方法を学習しようとしたとき、前の場面で、私はこの形式でそれらを設定するためのアドバイスを受けています

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 

最初のものは私のオリジナルの試みだった:私の提案コントローラ、editアクションで

は、私は、次のそれぞれを試してみました。それは仕事をしなかったし、このポストを書くように促した。

2番目の方法は、書き込むべき方法です。

3番目はTarynのアイデアを直接組み込んで、それを書くべきかどうかを確認することです(私はそれが何をすべきかを説明する一般的な方法だと思うが)。

これらの作業はありません。

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

私はこのありえない作業は範囲がテーブルとしてクラス上で実行されていることである理由ではなく、特定のインスタンスを考える:この試みの第二版の場合は、私が言うエラーが出ます編集する。私はthis postがそのことを説明していると思います。

プロポーザルには多くの潜在性があるので、特定のプロポーザルに属するすべての潜在性をチェックして、プロポーザルインスタンスのユーザーIDと同じユーザーIDを持つかどうかを確認することです。どうやってやるの? set_proposal方法は上適用するには、編集のための正しい提案を拾い出しているので、提案コントローラのeditアクションで

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に時間を費やし、私は上記の使用構文が正しくありませんされています

私が試しましたポストの一番上には、未定義の変数にエラーがあります)。私はスコープを書く方法を理解する方法を知らない。

Anyway-は、次の私は私の提案コントローラでeditアクションを変更してみました:私はこれを保存し、それをしようとすると、

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

は今、私はエラーを取得していないが、私は提案を編集しようとすると、I第三者によって作成された可能性を編集することができます。私は範囲を効果的に書いていないのか、この解決策が別の理由でうまくいかないのかどうかはわかりません。

答えて

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

モデル内にスコープを定義します...モデルを持つスコープをどこでも使用できます。 –

関連する問題