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

时间:2014-03-22 15:23:27

标签: ruby-on-rails ruby ruby-on-rails-4 model strong-parameters

我最近转换为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升级中缺少什么,我需要更改什么才能再次访问这些属性?

3 个答案:

答案 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