StaticPages#manager中的NoMethodError

时间:2015-09-29 05:35:04

标签: ruby-on-rails

我是铁杆菜鸟。我的联系表格有问题。 我有一个错误:undefined method 'name' for nil:NilClass

<p>
  <strong>Name:</strong>
  <%= @contact_forms.name %>
</p>

我的manager.html.erb是:

<div>
    <p>
      <strong>Name:</strong>
      <%= @contact_forms.name %>
    </p>

    <p>
      <strong>Text:</strong>
      <%= @contact_forms.text %>
    </p>
</div>

我的contact_form_controller.rb是:

class ContactFormController < ApplicationController
  def new
  end

  def create
    @contact_forms = Contact_form.new(params[:contact_form])

  @contact_forms.save

      redirect_to root_path
      end

      def show
        @contact_forms = Contact_form.all
      end
  end

我的迁移文件:

class CreateContactForms < ActiveRecord::Migration
  def change
    create_table :contact_forms do |t|
      t.string :name
      t.string :phone
      t.string :email
      t.text :text

      t.timestamps null: false
    end
  end
end

我的static_pages_controller.rb是

class StaticPagesController < ApplicationController
  def home
  end

  def manager
  end
end

由于

2 个答案:

答案 0 :(得分:1)

  

未定义的方法`name&#39;为零:NilClass

您没有在@contact_forms控制器的manager方法中定义static_pages,错误也是如此。如下定义它可以解决您的问题。

class StaticPagesController < ApplicationController
  def home
  end

  def manager
    @contact_forms = ContactForm.all
  end
end

<强> 更新

您还应该在@contact_forms

中迭代manager.html.erb,如下所示
<div>
  <% @contact_forms.each do |contact_form| %>
    <p>
      <strong>Name:</strong>
      <%= contact_form.name %>
    </p>

    <p>
      <strong>Text:</strong>
      <%= contact_form.text %>
    </p>
  <% end %>
</div>

答案 1 :(得分:1)

  

我是铁路菜鸟

欢迎来到这个家庭! You're a newb, not noob:)

帕万的回答是正确的;既然你是新人,我想给你一些背景信息:

  

nil的未定义方法'name':NilClass

此错误表示您尝试在尚未定义/填充的变量上调用方法

在您的情况下, @contact_forms未定义

许多新Ruby开发人员的困惑之处在于,Ruby不会停止整个程序,而是填充NilClass&amp;声称它有错误

因此,虽然您希望它声明该变量未声明,但它会向您提供有关方法如何不起作用的消息。

-

要解决您的问题,您需要使用以下内容:

#config/routes.rb
resources :contact_forms
resources :static_pages

#app/controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController
   def manager
      @contact_forms = ContactForm.all
   end
end

要从Pavan窃取,必须通过循环@contact_forms变量来备份(除非您使用ContactForm模型的单个实例填充它):

#app/views/static_pages/manager.html.erb
<% @contact_forms.each do |form| %>
    <%= form.name %>
<% end %>

顺便说一句,我从不建议调用控制器StaticPages

当您了解Ruby时,您会发现该语言的面向对象性质:

enter image description here

我解释了很多;基本上,这意味着你必须让你的程序以对象为中心,在Rails的情况下,由Models填充。

因此,您需要考虑在显示此视图时您尝试操作的数据对象。目前,您似乎想要显示contact表单 - 我会在ApplicationController中将其置于自己的方法中:

#config/routes.rb
match "contact", to: "application#contact_form", via: [:get, :post]

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
   def contact_form
     if request.post? 
         #post contact form
     else
         #load contact form
     end
   end
end