我有一个表单来编辑页面,但它告诉它不是我从相关问题中知道的变量。在视图中,此行引发了错误:
<%= 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。
答案 0 :(得分:3)
您的回溯说明model_name
<Gollum::Page:0x007f607dfec4e8>
未定义,Gollum::Page
是form_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_for
,ActiveRecord
无法实现这一点帮助方法。
好吧,如果您使用self.find
并希望继续覆盖where
方法,则可以在find_by_x
操作中使用edit
或def 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