7

私の質問はBuild vs new in Rails 3 に似ています。

Rails 3 では、ビューにオブジェクトを作成して、cancan を介して承認を確認することができました。

<% if can? :create, @question.answers.new %>
  # Code...
<% end %>

.newRails 3 では、との違いは.build.build新しく構築されたオブジェクトを親のコレクションに追加したことでした。これにより、ビューにレコードが追加されましたが、これは明らかに望ましくありませんでした。

ただし、Rails 4 では、どちらもオブジェクトをコレクションに追加し、ビューに空のレコードをレンダリングします。

これを解決する方法について誰かアドバイスはありますか?レコードが.persisted?ビューにあるかどうかを確認することはオプションですが、どうにかしてそうする必要はないと感じています。

編集:明確にするために、CanCan モデルは次のようになります。

can :manage, Answer do |answer|
  user.belongables.include?(answer.question.try(:belongable))
end

このため、クラスごとにチェックすることはできません。関係に基づいて比較するには、実際のインスタンスが実際に必要です。

4

2 に答える 2

4

私はCanCanについて完全に最新ではありませんが、作成する機能が@questionCanCanの特定のインスタンスに関連付けられていない限り、クラスに対する承認を直接確認できるようです。インスタンスを構築する必要はなく、ビューに不要なオブジェクトはありません。

<% if can? :create, Answer %>
  # Code..
<% end %>

https://github.com/ryanb/cancan/wiki/Checking-Abilities#checking-with-class

編集:

編集に基づいて、必要な質問に関連付けられたスタンドアロンの回答を作成してみてください。

<% if can? :create, Answer.new(question: @question) %>
  # Code..
<% end %>

少なくとも、コレクションにAnswerインスタンスを追加するべきではありません。@question.answers

于 2013-07-24T12:57:33.527 に答える