noMethodError - 未定义的方法。使用application_helper.rb中的方法时

时间:2013-01-18 02:40:39

标签: ruby-on-rails ruby-on-rails-3 view-helpers

尝试在application_helper文件中使用方法时收到noMethodError。

看起来helper方法本身很好,但是helper方法中的代码是什么触发了错误。我仔细检查了我的模型和模式文件,以确保我正确列出了属性。一双新鲜的眼睛会很受欢迎。

这是我的代码......

application_helper.rb

PS。我在这里展示了两组辅助方法,因为第一组(Resident Helper Methods)在其预期的视图中工作正常。

    # START -- Resident Helper Methods
      def resident_full_name
        ([@resident.fname, @resident.lname] - [ '' ]).compact.join(' ')
      end

      def resident_dob
        @resident.dob
      end

      def resident_gender
        @resident.gender
      end

      def resident_doc_full_name
        ([@resident.doc_fname, @resident.doc_lname] - [ '' ]).compact.join(' ')
      end

      def resident_doc_phone1
        @resident.doc_phone1
      end

      def resident_doc_address
        @resident.doc_address
      end

      def resident_doc_city
        @resident.doc_city
      end

      def resident_doc_state
        @resident.doc_state
      end

      def resident_doc_zip
        @resident.doc_zip
      end

      def resident_guard_full_name
        @resident.guard_full_name
      end

      def resident_guard_phone
        @resident.guard_phone
      end

      def resident_desrep_full_name
        @resident.desrep_full_name
      end

      def resident_desrep_phone
        @resident.desrep_phone
      end
    # END -- Resident Helper Methods
    # START -- User Helper Methods
      def user_full_name
        ([@user.fname, @user.lname] - [ '' ]).compact.join(' ')
      end
    # END -- User Helper Methods
    # START -- User Helper Methods
  def user_full_name
    @user_full_name = ([@user.fname, @user.lname] - [ '' ]).compact.join(' ')
    return @user_full_name
  end
# END -- User Helper Methods
# START -- Admin Helper Methods
  def fac_owner_full_name
    @fac_owner_full_name = ([@admin.owner_fname, @admin.owner_lname] - [ '' ]).compact.join(' ')
    return @fac_owner_full_name
  end

  def fac_name
    @fac_name = @admin.fac_name
    return @fac_name
  end

  def fac_lic_num
    @fac_lic_num = @admin.lic_num
    return @fac_lic_num
  end

  def fac_address
    @fac_address = @admin.fac_address
    return @fac_address
  end

  def fac_state
    @fac_state = @admin.fac_state
    return @fac_state
  end

  def fac_zip
    @fac_zip = @admin.fac_zip
    return @fac_zip
  end

  def fac_email
    @fac_email = @admin.fac_email1
    return @fac_email
  end

  def fac_phone
    @fac_phone = @admin.fac_phone1
    return @fac_phone
  end
# END -- Admin Helper Methods

show.html.erb

<tr>
    <td>
        <label for="fac_name">
            <b>Name of Facility/Home</b><br/>
            logger.debug(fac_owner_full_name)

            <%= fac_owner_full_name %>
            <%#= fac_name %>
        </label>
    </td>
    <td>
        <label for="fac_lic_num">
            <b>License Number</b><br />
            <%#= fac_lic_num %>
        </label>
    </td>
    <td>
        <label for="fac_email">
            <b>Email</b><br />
            <%#= fac_email %>
        </label>
    </td>
    <td>
        <label for="fac_phone">
            <b>Phone</b><br />
            <%#= fac_phone %>
        </label>
    </td>
    <td>
        <label for="fac_address">
            <b>Facility Address</b><br />
            <address>
                <%#= fac_address %><br />
                <%#= fac_city " " %><%#= fac_state %><br />
                <%#= fac_zip %>
            </address>
        </label>
    </td>
    <td>
        <label for="fac_owner_full_name">
            <b>Licensee Name</b><br />
            <%#= fac_owner_full_name %>
        </label>
    </td>
</tr>
<tr>
    <td>
        <label for="involved_person_full_name">
            <%= @incident_accident_form.involved_person_full_name %>
        </label>
    </td>

分贝/ schema.rb

create_table "admins", :force => true do |t|
    t.string   "owner_fname"
    t.string   "owner_lname"
    t.string   "lic_num"
    t.text     "fac_address"
    t.string   "fac_city"
    t.string   "fac_state"
    t.string   "fac_zip"
    t.string   "fac_name"
    t.string   "fac_phone1"
    t.string   "fac_phone2"
    t.string   "fac_phone3"
    t.string   "fac_phone4"
    t.string   "fac_phone5"
    t.string   "fac_phone6"
    t.string   "fac_phone7"
    t.string   "fac_phone8"
    t.string   "fac_phone9"
    t.string   "fac_phone10"
    t.string   "fac_phone11"
    t.string   "fac_phone12"
    t.string   "fac_phone13"
    t.string   "fac_phone14"
    t.string   "fac_phone15"
    t.string   "fac_phone16"
    t.string   "fac_phone17"
    t.string   "fac_phone18"
    t.string   "fac_phone19"
    t.string   "fac_phone20"
    t.string   "fac_phone21"
    t.string   "fac_phone22"
    t.string   "fac_phone23"
    t.string   "fac_phone24"
    t.string   "fac_phone25"
    t.string   "fac_phone26"
    t.string   "fac_phone27"
    t.string   "fac_phone28"
    t.string   "fac_phone29"
    t.string   "fac_phone30"
    t.string   "fac_email1"
    t.string   "fac_email2"
    t.string   "fac_email3"
    t.string   "fac_email4"
    t.string   "fac_email5"
    t.string   "fac_email6"
    t.string   "fac_email7"
    t.string   "fac_email8"
    t.string   "fac_email9"
    t.string   "fac_email10"
    t.datetime "created_at",  :null => false
    t.datetime "updated_at",  :null => false
  end

模型/ admin.rb

class Admin < ActiveRecord::Base
  attr_accessible :fac_address, :fac_city, :fac_name, :fac_state, :fac_zip, :lic_num,
  :owner_fname, :owner_lname, :fac_phone1, :fac_phone2, :fac_phone3, :fac_phone4, :fac_phone5,
  :fac_phone6, :fac_phone7, :fac_phone8, :fac_phone9, :fac_phone10, :fac_phone11, :fac_phone12,
  :fac_phone13, :fac_phone14, :fac_phone15, :fac_phone16, :fac_phone17, :fac_phone18,
  :fac_phone19, :fac_phone20, :fac_phone21, :fac_phone22, :fac_phone23, :fac_phone24,
  :fac_phone25, :fac_phone26, :fac_phone27, :fac_phone28, :fac_phone29, :fac_phone30,
  :fac_email1, :fac_email2, :fac_email3, :fac_email4, :fac_email5, :fac_email6, :fac_email7,
  :fac_email8, :fac_email9, :fac_email10

  # has_many :users
  # validate_on_create :user_count_within_bounds


  private

  def user_count_within_bounds
    return if users.blank?
    errors.add("") if users.length > 10
    errors.add("") if users.length > 25
  end
end

更新01-17-13美国东部时间晚上11:30 从服务器输出

Started GET "/residents/1/incident_accident_forms/11" for 127.0.0.1 at 2013-01-17 23:23:57 -0500
Processing by IncidentAccidentFormsController#show as HTML
  Parameters: {"resident_id"=>"1", "id"=>"11"}
  Resident Load (1.0ms)  SELECT "residents".* FROM "residents" WHERE "residents"."id" = $1 LIMIT 1  [["id", "1"]]
  IncidentAccidentForm Load (1.3ms)  SELECT "incident_accident_forms".* FROM "incident_accident_forms" WHERE "incident_accident_forms"."resident_id" = 1 AND "incident_accident_forms"."id" = $1 LIMIT 1  [["id", "11"]]
  Rendered incident_accident_forms/show.html.erb within layouts/application (6.3ms)
Completed 500 Internal Server Error in 14ms

ActionView::Template::Error (undefined method `owner_fname' for nil:NilClass):
    12:                             <b>Name of Facility/Home</b><br/>
    13:                             logger.debug(fac_owner_full_name)
    14: 
    15:                             <%= fac_owner_full_name %>
    16:                             <%= fac_name %>
    17:                         </label>
    18:                     </td>
  app/helpers/application_helper.rb:74:in `fac_owner_full_name'
  app/views/incident_accident_forms/show.html.erb:15:in `_app_views_incident_accident_forms_show_html_erb__403107391156795487_2183850600'


  Rendered /Users/beracus/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.5ms)
  Rendered /Users/beracus/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
  Rendered /Users/beracus/.rvm/gems/ruby-1.9.3-p362/gems/actionpack-3.2.9/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (9.4ms)

更新 incident_accident_forms_controller.rb

class IncidentAccidentFormsController < ApplicationController
  before_filter :get_resident
  before_filter :get_admin

  def index
    @incident_accident_forms = @resident.incident_accident_forms
  end

  def new
    @incident_accident_form = @resident.incident_accident_forms.build
  end

  def create
    @incident_accident_form = @resident.incident_accident_forms.build(params[:incident_accident_form])
    if @incident_accident_form.save
      redirect_to [@admin, @resident, @incident_accident_form] #, flash[:success] = "Form was created!"
    else
      render 'new', flash[:error] = "There was a problem with the form"
    end
  end

  def show
    @incident_accident_form = @resident.incident_accident_forms.find(params[:id])
  end

  def update
    @incident_accident_form = @resident.incident_accident_forms.find(params[:id])
    if @incident_accident_form.update_attributes(params[:incident_accident_form])
      flash[:success] = "Form updated!"
      redirect_to controller: 'residents', action: 'show', id: params[:id]
    else
      render 'edit', flash[:error] = "Unable to update form"
    end
  end

  def edit
    @incident_accident_form = @resident.incident_accident_forms.find(params[:id])
  end

  def destroy
    @incident_accident_form = @resident.incident_accident_forms.find(params[:id])
    @incident_accident_form.destroy
    flash[:notice] = "You sure?"
    redirect_to resident_incident_accident_forms_path
  end

  private
  # get_resident converts the resident_id given by the routing
  # into an @resident object, for use in this controller & coresponding views
  def get_resident
    @resident = Resident.find(params[:resident_id])
  end

  def get_admin
    @admin = Admin.find(params[:admin_id])
  end
end

2 个答案:

答案 0 :(得分:1)

由于您尝试在@admin nil上调用owner_fname方法,因此此错误实际上是@adminfac_owner_full_name。我会仔细检查你实际上是在控制器中设置该变量。

这似乎得到了确认,因为您的IncidentAccidentFormsController#show操作未对您的admins表进行任何SQL调用。

答案 1 :(得分:0)

将您的方法更改为以下格式:

def resident_full_name
  @resident_full_name = ([@resident.fname, @resident.lname] - [ '' ]).compact.join(' ')
  return @resident_full_name
end