私は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
属性を表示することを意味します。また、この属性によるメッセージのフィルターが必要です。
どうすればこれを達成できるかわかりません。
モデルでは、次の方法で仮想属性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 palindrome
のMessageSerializer
に続いてpalindrome
がJSON APIに公開されます。
Rubyでは実際にこの方法で仮想属性を作成できるため、ゲッターメソッドとセッターメソッドを手動で作成する必要がなくなります。
attr_reader :palindrome #getter
attr_writer :palindrome #setter
attr_accessor :palindrome #both
複数の引数を渡すこともできます:
attr_accessor :palindrome, :foo, :bar
ドキュメント は最高ではありません。