我最近转换为Rails 4和强大的参数,我很难搞清楚这一点。
我的模型看起来像这样:
class Message
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
validates :name, :email, :body, :presence => true
def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
end
def persisted?
false
end
end
我的理解是,我不需要一个包含强力参数的控制器,因为我严格来说是“#34;得到"它。我没有在任何地方更新或保存它,所以我不需要允许任何参数通过。但是,可以肯定的是,我有这个控制器:
class MessagesController < ApplicationController
private
def message_params
params.require(:message_params).permit(:name, :email, :body)
end
end
这会引发错误:
message = Message.new
message.name = 'test'
NoMethodError: undefined method `name=' for #<Message:0x007f9d620706f0>
我的模型曾经包含这个:
attr_accessor :name, :email, :body
它工作正常。我在rails 4升级中缺少什么,我需要更改什么才能再次访问这些属性?
答案 0 :(得分:1)
您仍然需要attr_accessor
来定义您的模型具有哪些属性。
还可以包含ActiveModel::Model
模块,而不是包含单独的模块:
class Message
include ActiveModel::Model
attr_accessor :name, :email, :body
validates :name, :email, :body, :presence => true
def persisted?
false
end
end
有关详细信息,请参阅ActiveModel documentation。
答案 1 :(得分:0)
所以你仍然想要使用attr_accessor。你将它与attr_accessible混合起来。
看一下这个答案:Difference between attr_accessor and attr_accessible
attr_accessor是&#34;是一种红宝石方法,可以制作一个getter和一个setter&#34;而attr_accessible现在是一个不受支持的&#34; rails方法,允许您将值传递给批量赋值:new(attrs)或up update_attributes(attrs)。&#34;
答案 2 :(得分:0)
您正在创建无表格模型。默认情况下,模型的访问者方法未创建。您需要为此特定模型的属性显式添加 attr_accessor 才能读取和写入属性。因此,错误。
对于带有table的模型,模型类从 ActiveRecord :: Base 扩展,它负责动态创建属性的访问器方法,因此您不需要在那里指定 attr_accesor 。