【问题标题】:Rails - undefined method `model_name' when calling editRails - 调用编辑时未定义的方法“model_name”
【发布时间】:2016-04-06 03:31:09
【问题描述】:

我有一个表单来编辑页面,但它告诉我它不是我从相关问题中知道的变量。看来,从这一行引发了一个错误:

<%= form_for @wiki, :url => giki_path(@wiki.name), :html => { :method => :put } do |f| %>

@wiki 似乎是一个实例,可以通过以下方式确认:

$ rails console
> @wiki
 #<Gollum::Page:70026260995800 Home (markdown) @wiki="path/to/git/wiki/.git">
> @wiki.name
"/wiki/Home"

所以我不明白是什么导致了问题:

undefined method `model_name' for #<Gollum::Page:0x007f6084d2bdb0>

编辑

在控制器中:

# giki_controller.rb
def edit
  @wiki = Wiki.find(params[:id])
end

# the same method, worked fine
def show
  @wiki = Wiki.find(params[:id])
end

在模型中:

# wiki.rb
class Wiki 
  include ActiveModel::AttributeMethods
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :raw_data, :formatted_data, :title, :path, :change_desc, :versions

  # Gollum Init
  WIKI = Gollum::Wiki.new(Settings.wiki_repo, :base_path => "/wiki")

  # initialize
  def initialize(attributes = {})
    attributes.each do |key, value|
      send("#{key}=", value)
    end
  end
  # no database
  def persisted?
    false
  end

  def self.find(name)
    WIKI.page(name) # find a page by name
  end

记录器的第一行:

NoMethodError - undefined method `model_name' for #<Gollum::Page:0x007f607dfec4e8>:
  actionpack (4.2.6) lib/action_controller/model_naming.rb:9:in `model_name_from_record_or_class'
  actionview (4.2.6) lib/action_view/record_identifier.rb:47:in `dom_class'

完整回溯:我创建了一个gist

【问题讨论】:

  • 请提供实际的错误信息,未经编辑。
  • @toddmetheny 回溯太长。我使用了better_errors,其中唯一提示的消息是未定义的方法行。
  • 那么你真的在你的应用程序中调用了一个名为model_name的方法吗?如果是,请提供与该方法调用相关的代码。
  • @toddmetheny 我不这么认为。它隐含在回溯的某个地方。我会更新代码。
  • 您的edit 操作在您的WikisController 中是什么样的?

标签: ruby-on-rails


【解决方案1】:

您的回溯表明model_name&lt;Gollum::Page:0x007f607dfec4e8&gt; 中未定义,这是Gollum::Page 的一个实例。


原因

form_for 方法内部调用model_name 方法。这实际上是ActiveRecord 实例中的有效方法名称。 试试

User.first.model_name

@wiki 中不存在此 model_name,因为这不是 Wiki 的实例,而是 Gollum::Page 的实例。

怎么说呢?

好吧,我看到你已经覆盖了Wiki 中的self.find 方法

  def self.find(name)
    WIKI.page(name) # find a page by name
  end

所以在您的edit 操作中,您使用了find 方法来获取持久化实例,这将把您交给一个实例Gollum::Page,而这不是form_for 辅助方法所期望的。

解决方案(已编辑)

好吧,如果您使用 ActiveRecord 并希望继续覆盖 self.find 方法,那么您可以在 edit 操作中使用 wherefind_by_x 方法。喜欢

def edit
  @wiki = Wiki.find_by_id(params[:id])
end

但是看起来你没有使用ActiveRecord 或者你的模型不是从它派生的,所以你必须以不同的方式使用form_for 方法。

如果您不需要将表单附加到模型实例,请查看ActionView::Helpers::FormTagHelper#form_tag

form_tag(giki_path(@wiki.name), method: :put)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多