2015-11-16 33 views
13

私はRubyonRails/ActiveAdminアプリケーションで作業しています。私のRoRバージョンは4.2.5、AAバージョンは1.0.0です。私はモデルMessageを次のように持っています。Ruby on Railsのモデルに仮想属性を追加するには?

class Message < ActiveRecord::Base 

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

    def palindrome 
    # return true/false 
    end 

end 

見ての通り、私はメッセージのみのcontentに依存し、読み取り専用属性palindromeを持っていると思います。この属性を通常の属性とまったく同じように扱いたい。通常は、rails consoleでメッセージを取得するか、json形式のメッセージをリクエストすると、リストにpalindromeという属性が表示されます。私はまた、この属性によってメッセージ用のフィルターを持っていたいと思います。

私はこれをどのように達成できるかわかりません。お使いのモデルで

答えて

10

仮想属性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属性をホワイトリストに登録する必要がありますpalindromeの値を一括して割り当てることができるように、コントローラ内の強力なパラメータ定義内の他のモデル属性。このようなもの:

# your_controller.rb 
private 

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

このRailsCast on Virtual Attributesをご覧ください。しかし、少し古いですが、コンセプトには役立ちます。

注:

仮想属性が自動的にPARAMリストに表示されません。しかし、次のようにRailsコンソールを使ってアクセスできるはずです:Message.new.palindrome。また、たとえば、Active Model Serializerを使用している場合は、MessageSerializerattribute palindrome、次にpalindromeをJSON APIに公開するなど、JSON APIでこの仮想属性を公開できます。

+0

まあし、ありがとうございました。私には2つの質問があります。まず、別の属性の値にしか依存しないため、この属性を書き込み可能にしたくありません。第二に、 'self [:palindrome]'と評価するのは何ですか? – moorara

+0

属性値を記述する必要がない場合は、setterメソッドを使用せず、強力なparam定義でホワイトリストを作成します。 'self [:palindrome]'はあなたのモデルオブジェクトのインスタンスである 'self'のpalindromeの値を与えます。これは 'model_instance.palindrome'と似ています。今はっきりしたいと思っています。他の質問がある場合はお知らせください。 –

+0

これはparamsリストに表示されますか? –

15

Railsは、実際にあなたが仮想属性を手動でgetterメソッドとsetterメソッドを作成することからあなたを保つこの方法を、作成してみましょう:

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

あなたは、あまりにも複数の引数を渡すことができます。

attr_accessor :palindrome, :foo, :bar 
関連する問題