Rails - 调用edit时未定义的方法`model_name'

时间:2016-04-06 03:31:09

标签: ruby-on-rails

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

<%= 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

1 个答案:

答案 0 :(得分:3)

您的回溯说明model_name <Gollum::Page:0x007f607dfec4e8>未定义,Gollum::Pageform_for的实例。

原因

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

model_name

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

我该怎么说?

好吧,我看到你已经覆盖了Wiki

中的 def self.find(name) WIKI.page(name) # find a page by name end 方法
edit

因此,在您的find操作中,您已使用Gollum::Page方法获取持久化实例,该实例将移交您实例form_forActiveRecord无法实现这一点帮助方法。

解决方案(编辑)

好吧,如果您使用self.find并希望继续覆盖where方法,则可以在find_by_x操作中使用editdef edit @wiki = Wiki.find_by_id(params[:id]) end 方法。喜欢

ActiveRecord

但看起来你没有使用form_for或者你的模型不是从它派生的,所以你必须以不同的方式使用form_tag(giki_path(@wiki.name), method: :put) 方法。

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

FormBuilder