繁体   English   中英

Rails 4强参数-模型上未定义的方法名称

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM