为什么Ruby on Rails会不断告诉我一个未实例化的变量?

时间:2015-07-16 12:08:21

标签: ruby-on-rails ruby nomethoderror

编辑:已解决,在Brian Kunzig的回答+评论中查看解决方案。

我决定试用Ruby on Rails并且一直在遇到这个问题。我一直在寻找这样的问题,但没有一个解决方案能为我做到这一点。似乎我不断写出一些不正确的代码。所以这里有一些代码片段:

(忽略代码的用途,只是为了尝试填充)

我的控制器:

class AuthsController < ApplicationController

        def index
          @auths=Auth.all  
        end

        def new
          @auth=Auth.new
        end

        def show
          @auth=Auth.find(params[:id])
        end
end

我的index.html.erb:

<div style="margin: 0 auto; width:50%; text-align: center">
    <h1>Please authorise your use of this webpage and its database(s).</h1>
    <%= form_for :auth, url: auths_path do |f| %>

    <% if @auth.errors.any? %> ==> RAILS REPORTS ERROR IN CODE HERE
    <div id="error_explanation">
      <h2>
        <%= pluralize(@auth.errors.count, "error") %> prohibited
        this authentification from being saved:
      </h2>
      <ul>
        <% @auth.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= f.label :username %><br>
    <%= f.text_field :username %>
  </p>

  <p>
    <%= f.label :password %><br>
    <%= f.text_field :password %>
  </p>

  <p>
    <%= f.submit %>
  </p>

<% end %>

</div>

所以,底线。例如,Rails说我不能在form_for块中使用@auth。或者其他任何地方。它总是说它属于NilClass或类似的东西。它显然希望我以某种方式实例化它,但是不足以使方法成为新的并且放在行中:@ auth = Auth.new?

我只是对这种情况感到困惑,因为我无法弄清楚它应该怎么做。非常感谢!

P.S。我使用<%= form_for :auth, url: auths_path do |f| %>是因为它不接受@auth,这就是下一行中的错误。我已经看到了实例化它的解决方案&#34;在旅途中&#34;在控制器之外但我想以它应该完成的方式去做。

1 个答案:

答案 0 :(得分:0)

您应该将此表单放在new.html.erb文件中,而不是indexindex用于在newcreate操作处理POST请求时列出条目。您收到错误的原因是,当您没有创建任何Auth时,您会尝试列出所有Auth。此外,如果您正在使用标准的铁路路由,则可以通过GET请求发送表单。使用资源丰富的路由并将此表单放在该控制器的new视图中,它应该可以正常工作。

路由文件应为:

resources :auths

这将自动提供所有必要的路由。如果在修改此内容后键入rake routes,您将看到新生成的URL及其帮助程序。您会注意到,createupdate操作为POST / PUT提供了GET / VerticalAlignment请求,而其他操作则为Top