web-dev-qa-db-ja.com

Ruby on Railsで仮想属性をモデルに追加する方法は?

私はRubyonRails/ActiveAdminアプリケーションに取り組んでいます。 RoRバージョンは4.2.5で、AAバージョンは1.0.0です。次のようなモデルMessageがあります。

class Message < ActiveRecord::Base

  belongs_to :user
  validates :user, :content, presence: true

  def palindrome
    # return true/false
  end

end

ご覧のとおり、メッセージのpalindromeのみに依存する読み取り専用属性contentが必要です。この属性を通常の属性とまったく同じように処理したい。通常、私はRails consoleを介してメッセージを取得するとき、またはjson形式のメッセージを要求するとき、リストにpalindrome属性を表示することを意味します。また、この属性によるメッセージのフィルターが必要です。

どうすればこれを達成できるかわかりません。

20
moorara

モデルでは、次の方法で仮想属性palindrome属性の属性アクセサー(リーダー/ライター)を記述できます。

# attr_reader
def palindrome
  self[:palindrome]
end

# attr_writer
def palindrome=(val)
  self[:palindrome] = val
end

# virtual attribute
def palindrome
  #return true/false
end

また、Rails 4を使用している場合、値を一括割り当てできるようにするには、コントローラー内の強力なパラメーター定義で他のモデル属性と同様にpalindrome属性をホワイトリストに登録する必要がありますof palindrome。このようなもの:

# your_controller.rb
private

def your_model_params
  params.require(:message).permit(:palindrome)
end

これをご覧ください RailsCast on Virtual Attributes 。ただし、少し古いですが、概念には役立ちます。

注:

仮想属性は、paramリストに自動的に表示されません。ただし、Rails console as this:Message.new.palindrome。また、JSON APIでこの仮想属性を公開できます。たとえば、 Active Model Serializer を使用している場合、次のようにできます:attribute palindromeMessageSerializerに続いてpalindromeがJSON APIに公開されます。

14

Rubyでは実際にこの方法で仮想属性を作成できるため、ゲッターメソッドとセッターメソッドを手動で作成する必要がなくなります。

attr_reader   :palindrome #getter
attr_writer   :palindrome #setter
attr_accessor :palindrome #both

複数の引数を渡すこともできます:

attr_accessor :palindrome, :foo, :bar

ドキュメント は最高ではありません。

23
Brent Eicher