使用Rails 4.2.5教程的form_for文章#new中的NoMethodError

时间:2018-01-26 21:20:00

标签: ruby-on-rails ruby ruby-on-rails-3 nomethoderror

我正在尝试完成官方Rails教程和第5.2步。说明是做一个form_with,但我收到一个错误,查看这个StackOverflow帖子: Rails form_with results in a NoMethodError。我将form_with更改为form_for,就像答案所说的那样,我收到了这个错误:

文章#new 中的

NoMethodError

显示/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

2 个答案:

答案 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 %>

给定@articleform_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并确保它与您正在阅读的教程版本相同。