8

'attr_accessible'が削除されたので、どのようにしてレール4に仮想属性(ゲッター、セッター)を使用できますか?レールの仮想属性4

私はここ

def tags_list 
    @tags = self.tags.collect(&:name).join(', ') 
    end 

更新/作成しようとしたとき、私は、以下のセッターに到達することができる方法の上に到達することはできませんが、問題を取得しています。

def tags_list=(tags) 
    @tags = tags 
    end 
+1

attr_accessibleとattr_accessorが混在していますか? attr_accessibleはなくなりました。強いパラメータに置き換えられました。しかし、私が知る限り、attr_accessorは残っています。 – Edward

+0

申し訳ありませんが、attr_accessor:tags_list –

+2

attr_accessorを使用する場合は、ゲッターまたはセッターをまったく定義する必要はありません。 attr_accessorは、それらの両方を作成するマクロです。 –

答えて

12

Rails 4の仮想属性は、attr_accessibleとほぼ同じです。コントローラ内の許可されたパラメータ(attr_accessibleではなく)に仮想属性を追加して、モデル内に通常どおりgetterメソッドとsetterメソッドを追加するだけです。

# your_controller.rb 
private 

def your_model_params 
    params.require(:your_model_name).permit(:tags_list) 
end 
+2

しかし、これは#newと#createでは現時点ではうまくいかないので、 'your_virtual_attr =:something'を常に別に書く必要があるので、かなり役に立たなくなります。他の誰かがこれに気づいて、それをどう扱うかについての手がかりを持っていますか? – phikes

+1

私は 'Tag.new(tags_list:[1、2])'を呼び出すと 'tags_list =()'という仮想属性が呼び出されないことにも気付きました。これはバグですか? – Feech

+1

@phikes、それはちょうど 'before_action:your_model_params'ですか?オプションで、:[:new、:create]または 'exlcude:、except:[:action1、:action2、etc.]のように指定することもできます。 –

関連する問題