我正在尝试完成官方Rails教程和第5.2步。说明是做一个form_with,但我收到一个错误,查看这个StackOverflow帖子:
Rails form_with results in a NoMethodError。我将form_with
更改为form_for
,就像答案所说的那样,我收到了这个错误:
显示/home/ubuntu/workspace/app/views/articles/new.html.erb第2行引发:
undefined method 'model_name' for {:scope=>:article, :url=>"/articles", :local=>true}:Hash
提取的来源(第2行):
1. <h1>New Article</h1>
2. <%= form_for scope: :article, url: articles_path, local: true do |form| %>
3. <p>
4. <%= form.label :title %><br>
5. <%= form.text_field :title %>
6. </p>
Rails.root:/ home / ubuntu / workspace
app/views/articles/new.html.erb:2:in '_app_views_articles_new_html_erb__1707235537542743350_40377020'
我正在使用Cloud9,如果有帮助的话。这是我的视图和控制器的代码:
视图:
<h1>New Article</h1>
<%= form_for scope: :article, url: articles_path, local: true do |form| %>
<p>
<%= form.label :title %><br>
<%= form.text_field :title %>
</p>
<p>
<%= form.label :text %><br>
<%= form.text_area :text %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
控制器:
class ArticlesController < ApplicationController
def new
end
def create
render plain: params[:article].inspect
end
end
答案 0 :(得分:1)
我原以为你的ArticleController
会是这样的:
class ArticlesController < ApplicationController
def new
@article = Article.new
end
def create
render plain: params[:article].inspect
end
end
您的观点如下:
<h1>New Article</h1>
<%= form_for @article do |form| %>
<p>
<%= form.label :title %><br>
<%= form.text_field :title %>
</p>
<p>
<%= form.label :text %><br>
<%= form.text_area :text %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
给定@article
,form_for
只要正确推断网址:
传递给form_for的记录是一种资源,即它对应于一组RESTful路由,例如,使用config / routes.rb中的resources方法定义
根据docs。
也许值得注意的是,form_for
的签名(再次,根据文档):
form_for(record,options = {},&amp; block)
这意味着form_for
期望传递(1)记录,(2)零或更多选项,以及(3)块。 A&#39;记录&#39;实际上可以是许多内容之一(例如实例,字符串或符号),如文档中所述。
当你这样做时:
<%= form_for scope: :article, url: articles_path, local: true do |form| %>
我相信发生的事情是form_for
接受散列{scope: :article, url: articles_path, local: true}
作为记录,并尝试通过在散列上调用model_name
来推断url。哈希当然不会回复model_name
,所以你得到:
undefined method 'model_name' for {:scope=>:article, :url=>"/articles", :local=>true}:Hash
答案 1 :(得分:0)
您可能正在运行旧版本的Rails。在命令行上运行0123456789a
并确保它与您正在阅读的教程版本相同。