1

cancan から pundit に移行したばかりで、承認を確認する cancan 構文を楽しんだ: can? :show, @user. 評論家で、同じ検証が書かれてpolicy(@user).show?います。読みにくいと思います。だから私は2つの小さなラッパーを書いています:

def can?(model, action)
  policy(model).send(action)
end

def cannot?(model, action)
  ! can?(model, action)
end

私の質問は次のとおりです。Rails 4 では、コントローラーとビューで使用していることを知っているため、2 つのラッパーに最適な場所はどこですか。まだモデルではありませんが、後で当てはまる可能性があります。

  • ビューヘルパーを使用すると、ビューでのみ使用できます
  • アプリケーション コントローラー ヘルパーを使用すると、ビューのテスト中に rspec で使用できず、モデルで使用できないと信じています

どんなポインタでも感謝します、ありがとう

4

1 に答える 1

6

それらをモジュールにラップすることをお勧めします。クラス n モジュールを記述し、モジュールをアプリケーションの/libフォルダーに配置します。これは、コントローラー、ビュー、およびモデルでもアクセスできる最適な場所です。Ruby では、モジュールは 3 つの異なる目的で使用されます。まず名前空間です。モジュール内にクラスまたは定数を定義しても、そのモジュール外のクラスまたは定数と衝突することはありません。このようなもの

class Product
  def foo
    puts 'first'
  end
end

module Affiliate
  class Product
    puts 'second'
  end
end

p = Product.new
p.foo # => 'first'

p = Affiliate::Product.new
p.foo # => 'second'

モジュールの 2 番目の使用法は、実際には他に場所がないメソッドを貼り付ける場所としてです。クラス内でもこれを行うことができますが、モジュールを使用すると、コードを読んでいる人に、インスタンス化することを意図していないことがわかります。このようなもの

module Foo
  def self.bar
    puts 'hi'
  end
end

Foo.bar #=> 'hi'

最後に (そして最も紛らわしいのは)、モジュールを他のクラスに含めることができるということです。このようにそれらを使用することは、ミックスインとも呼ばれます。これは、すべてのメソッドを、含めるものに「ミックスイン」しているためです。

module Foo
  def bar
    puts 'hi'
  end
end

class Baz
  include Foo
end

b = Baz.new
b.bar #=> 'hi'

ミックスインは、実際には、ここで取り上げるよりもはるかに複雑なトピックですが、深く掘り下げるとおそらく混乱するでしょう。

さて、私には、S3 は実際にはコントローラーに属しているように思えます。なぜなら、コントローラーは通常、着信接続と発信接続を処理するものだからです。その場合は、アプリケーション コントローラーに保護されたメソッドを配置するだけです。これは、他のすべてのコントローラーからアクセスできますが、プライベートであるためです。

モデルにもそれが含まれている正当な理由がある場合は、ミックスインを使用します。何かのようなもの

module AwsUtils
private
  def S3
    AWS::S3::Base.establish_connection!\
      :access_key_id     => 'Not telling',
      :secret_access_key => 'Really not telling'

    data = yield
    AWS::S3::Base.disconnect
    data
  end
end

それを lib/aws_utils.rb に入れると、コントローラーとモデルの両方に include AwsUtils を追加することで使用できるようになります。Rails は、lib でクラスとモジュールを探すことを知っていますが、名前が一致する場合のみ (広い場合) のみです。これを AwsUtils と呼んだのは、それ (aws_utils.rb) を見たときにレールが何を探すかを知っているからです。正直なところ、S3Utils に何が必要なのかわかりません。

モジュールは、Ruby で驚くべきものの 1 つになる傾向がありますが、初心者にとってはまったく困惑します。

この提案がお役に立てば幸いです。ありがとうございます。

于 2013-07-28T10:49:01.653 に答える