[英]Rails 4 strong params - Undefined method name on model
我最近改用了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
据我了解,此模型不需要包含强参数的控制器,因为我严格地“获取”了它。 我不会在任何地方进行更新或保存,因此不需要允许任何参数传递。 但是,可以肯定的是,我有这个控制器:
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升级中缺少什么,需要进行哪些更改才能再次访问这些属性?
您仍然需要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文档 。
因此,您仍然要使用attr_accessor。 您正在将其与attr_accessible混合在一起。
看一下这个答案: attr_accessor和attr_accessible之间的区别
attr_accessor是“是使获取器和设置器成为一个红宝石方法”,而attr_accessible现在是不受支持的“ rails方法,它允许您将值传递给大规模分配:new(attrs)或up_update_attributes(attrs)。”
您正在创建一个无表模型。 默认情况下, 不会为您的模型创建访问器方法。 您需要为该特定模型的属性显式添加attr_accessor ,以便读写属性。 因此,错误。
对于带有表的模型,模型类从ActiveRecord :: Base扩展而来,该类负责动态创建属性的访问器方法,因此您无需在此处指定attr_accesor 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.