2

新しいレコードの作成中に CanCan を超えて仮想属性を取得する方法を考え出すのにかなりの時間を費やしています。

:name と :description のチームがあります

チームにはメンバーシップを通じてユーザーがいます。これは、別のコントローラーアクションを通じて制御し、「member_selections」と呼ばれるパラメーターにデータを保持し、非固有のキー (user_id => role) を持つハッシュを含みます。

したがって、私の params ハッシュは次のようになります。

params[:team] = {name: "Super Team", description: "It is super", 
member_selections: {"1"=>"member", "2"=>"leader"}}

ここで参照されているように、強力なパラメーターに対する通常の CanCan ソリューションがあります: https://github.com/ryanb/cancan/issues/835

ホワイトリストを介して仮想属性をパンチするために、ここで言及されている手法を使用しました

具体的には、私の「team_params」メソッドは次のようになります。

def team_params
  params.require(:team).permit(:name, :description).tap do |whitelist|
    whitelist[:member_selection] = params[:team][:member_selection]
  end
end

.tap とホワイトリスト ブロックを削除すると、新しいチームを作成できますが、新しいメンバーを追加することはできません。

.tap を維持すると、新しいメンバーを追加できますが、新しいチームを作成できません。「新しい」フォームを送信すると、次の結果が得られます。

ActiveRecord::UnknownAttributeError in TeamsController#create
unknown attribute: member_selection 

TeamsController#create メソッドが適切に呼び出される前でもこのエラーが発生するため、Team.new/.create にパラメーターを間違って渡すことは問題ではなく、CanCan の問題であることを示唆しています。

Rails 4の仮想属性とCanCanでこの問題を抱えている人はいますか? どうすればこれを回避できますか?

ありがとう!

4

1 に答える 1