为什么我一直得到NoM​​ethodError?我正在通过&#34开始学习rails;开始使用rails"指南

时间:2017-11-03 23:02:26

标签: ruby-on-rails ruby ruby-on-rails-5

我知道这是一个超级noobie问题,我现在正在学习rails。我正在按照Rails入门指南进行操作,并且我已经正确地遵循了每一步,但是当我进入" The First Forms"部分。它似乎一直在文章#new"中给我一个" NoMethodError。错误信息。这是完整的错误:

undefined method `form_with' for #<#<Class:0x007f31e8904248>:0x007f31dc290b70>
Did you mean?  form_tag

以下是表单代码:

<%= form_with scope: :articles, 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 %>

我似乎无法理解为什么它无法正常工作。您认为这个问题是什么?我看过几个答案,说使用form_for,但这也给了我一个错误。

另外,我正在使用:

Rails: 5.0.6

提前致谢:)

2 个答案:

答案 0 :(得分:2)

如果您使用的是rails 5.1,则form_for / form_tag将替换为form_with

请验证您的导轨版本?在你的情况下,它是5.0.6,这就是为什么它抛出错误

如果低于5.1,则使用表格标签或form_for

尝试 1)form_for

"world"

2)form_tag

const

form_tag和form_for被软弃用,将来它们将被form_with替换。

如果您没有基础模型,则使用form_tag。

div.container > div.clear > nav

当你有一个模型时,你使用了form_for。

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

正如您所看到的,我们使用form_for表单构建器字段助手,但我们不使用form_tag。因此两种形式的语法都不同。

form_with不是这种情况,因为我们一直使用表单构建器。

form_with没有模型:

<%= form_tag articles_path do %>
        <p> 
             <%= label_tag :title %><br>
             <%=  text_field_tag :title %> 
         </p>
         <p>
              <%= label_tag :text %><br> 
              <%= text_field_tag :text %> 
          </p>
           <p> 
               <%= submit_tag "submit" %> 
           </p>
     <% end %>

form_with with model:

<%= form_tag users_path do %>
   <%= text_field_tag :email %>
   <%= submit_tag %>
<% end %>

设置模型参数时,范围和URL会自动从中派生。此行为类似于form_for。

答案 1 :(得分:1)

我相信在Rails 5.1中引入了form_with。您正在使用Rails 5.0.6。在您考虑更新rails之前,我会先尝试将:articles更改为单数:article。它可以这么简单。