1

Rails のフォーム検証は、モデルに最も簡単に組み込まれるように設計されています。ただし、現在のユーザーが投稿を送信するために必要な権限を持っていること、およびcurrent_user変数がコントローラーとビューでのみアクセスできることを確認する必要があります。

私は同様の質問でこの答えを見つけました:

:user_goldの仮想属性を定義し、Bookアクセスできるコントローラーに設定してから、それを検証current_userに組み込むことができます。Book

current_userモデルで変数にアクセスできるように、投稿とユーザーコントローラーでこれを設定するにはどうすればよいですか?

解決:

@Deefourの回答が指摘したように、アプリケーション設計の観点からすると、このすべてが間違っています。条件が真でない限り、ビューがフォームをレンダリングしないように変更しました。

4

4 に答える 4

4

「同様の質問」は、あなたがこのようなことをすることができると言っています

class YourModel < ActiveRecord::Base
  attr_accessor :current_user

  # ...
end

次に、コントローラーアクションで次のようなことを行うことができます

@your_model = YourModel.find(params[:id])
@your_model.current_user = current_user
@your_model.assign_attributes(params[:your_model])

if @your_model.valid?
  # ...

その後、の検証メソッドself.current_user内で使用できます。YourModel


私はこの「検証」を「承認」ほど考慮していないので、これがあなたがすべきことだとは思わないことに注意してください。YourModel権限のないユーザーは、インスタンスへのそのような更新を保存できるアクションの一部を取得することさえできないはずです。


要求に応じてPunditで認証を行う場合は、次のファイルがあります。app/policies/your_model.rb

class YourModelPolicy < Struct.new(:user, :your_model)
  def update?
    user.some_privilege == true # change this to suit your needs, checking the "required privileges" you mention
  end
end

あなたの中にPunditを含めるApplicationController

class ApplicationController < ActionController::Base
  include Pundit
  # ...
end

次に、コントローラーアクションで簡単に実行できます

def update
  @your_model = YourModel.find(params[:id])
  authorize @your_model

  # ...

メソッドはのメソッドauthorizeを呼び出しYourModelPolicyデフォルトではアクションに一致するメソッドを呼び出します+ ) 、偽の値が返された場合は403エラーが発生します。update??

于 2013-01-12T02:31:28.603 に答える
2

モデルで承認を行うべきではありません。モデルにはすでに多くの責任がありますね。

これはコントローラーのことであり、実際には、cancanなどのgemを使用して他の場所にロジックを配置し、コントローラーで次のようなことを行うことができます。

authorize! :create, Post
于 2013-01-12T02:34:17.103 に答える
1

モデルに「仮想属性」を次のように定義できます。

class Book < ActiveRecord::Base
  attr_accessor :current_user
end

その値は、次のようにコントローラーで直接設定できます。

class BooksController < ApplicationController
  def create
    book = Book.new
    book.current_user = current_user
    book.save!
  end
end

また、モデルの検証ルーチン内では、他のActiveRecordフィールドと同じようにアクセスできます。

def validate_user_permission
  errors[:current_user] = "user does not have permission" unless current_user.is_gold?
end

これがActiveRecordの場合であるかどうかは思い出せませんが、、、などの一括割り当てメソッドを介して、コントローラーで仮想属性を設定できる可能性がcreateありupdateますnew

def create
  Book.create!(current_user: current_user)
end

これを行うには、モデルに次の行を追加して、その仮想属性の一括割り当てを有効にする必要があります。

attr_accessible :current_user
于 2013-01-12T02:44:35.480 に答える
0

私は Ismael に同意します - これは通常コントローラーで行われます。これはモデルの属性ではなく、権限の問題であり、コントローラーのビジネス ロジックに関連しています。

CanCan のような gem のすべての機能が必要ない場合は、独自の機能を使用できます。

class BooksController < ApplicationController

  before_filter :gold_required, :only => :create

  def create
    book = Book.new
    book.save!
  end


  # Can be application controller
  private
  def gold_required
    return current_user && current_user.is_gold?
  end

end

'new' メソッドにもフィルタを適用することをお勧めします。

于 2013-01-12T05:20:45.313 に答える