簡體   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