代码之家  ›  专栏  ›  技术社区  ›  RailRunner16

使用Rails 4.2.5教程的文章#新表单#中的命名错误

  •  0
  • RailRunner16  · 技术社区  · 7 年前

    我正在尝试完成Rails官方教程和步骤5.2。说明是使用执行form\u,但我发现一个错误,查阅了此StackOverflow帖子: Rails form_with results in a NoMethodError . 我改变了 form_with form_for 正如答案所说,我得到了这个错误:

    文章中的命名错误#新建

    显示/主页/ubuntu/工作区/应用程序/视图/文章/新建。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>
    

    导轨。根目录:/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 回复  |  直到 7 年前
        1
  •  1
  •   jvillian    7 年前

    我本以为你 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 将正确推断url,只要:

    传递给form\u for的记录是一个资源,即它对应于一组RESTful路由,例如使用config/routes中的resources方法定义的。rb型

    根据 docs .

    或许还值得注意的是 form\u for 是(同样,根据文件):

    form\u for(记录,选项={},&块)

    也就是说 form\u for 期望传递(1)一条记录,(2)零个或多个选项,以及(3)一个块。“记录”实际上可以是文档中描述的许多事物之一(例如实例、字符串或符号)。

    当您这样做时:

    <%= form_for scope: :article, url: articles_path, local: true do |form| %>
    

    我相信发生的事情是 form\u for 正在接受哈希 {scope: :article, url: articles_path, local: true} 作为记录并尝试通过调用 model_name 在哈希上。哈希自然不会响应 model\u名称 ,因此您可以:

    undefined method 'model_name' for {:scope=>:article, :url=>"/articles", :local=>true}:Hash
    
        2
  •  0
  •   DiegoSalazar    7 年前

    您可能正在运行旧版本的Rails。在命令行上运行 rails -v 并确保其版本与您正在阅读的教程相同。