【问题标题】:Rails 4 strong params - Undefined method name on modelRails 4强参数 - 模型上未定义的方法名称
【发布时间】:2014-03-22 15:23:26
【问题描述】:

我最近转换到 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 它将为属性创建 setter 和 getter 方法

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


【解决方案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 了解更多信息。

【讨论】:

    【解决方案2】:

    所以你还是要使用 attr_accessor。你把它和 attr_accessible 混在一起了。
    看看这个答案:Difference between attr_accessor and attr_accessible

    attr_accessor 是“一种创建 getter 和 setter 的 ruby​​ 方法”,而 attr_accessible 现在是一种不受支持的“rails 方法,它允许您将值传递给批量赋值:new(attrs) 或 up update_attributes(attrs)。 "

    【讨论】:

      【解决方案3】:

      您正在创建一个无表模型。默认情况下,访问器方法不会为您的模型创建。您需要为这个特定模型的属性显式添加 attr_accessor 以便读取和写入属性。因此,错误。

      对于带有表格的模型,模型类从 ActiveRecord::Base 扩展而来,它负责为属性动态创建访问器方法,因此您无需在此处指定 attr_accesor .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-10
        • 2013-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多