使用时,视图中的实例变量变为nil

时间:2014-02-10 06:10:07

标签: ruby-on-rails-4

这里的总结果问题,我仍然很难解释这种情况。

我的控制器将用户发送到显示页面

class PriceListsController < ApplicationController

include PriceListsHelper


def show
    if params[:customer_id].blank?

        @dispatch_location = "F02"
        @price_list = PriceList.find(params[:id]).price_list
        @full_price_list = PriceList.where("price_list = ?", @price_list).all
        else

        @dispatch_location_price_list =  Customer.find(params[:customer_id]).dispatch_location_price_list
        @price_list = Customer.find(params[:customer_id]).customer_selling_price_list
        @full_price_list = PriceList.where("price_list = ?", @price_list).all
    end
  end
end

从这里,我的展示页面循环遍历每个价目表并返回有关该价格表的详细信息。

<%= render 'price_lists/sidebar' %>
<% provide(:title, "Show Price List") %>
<h1><%=@dispatch_location_price_list + " " + params[:id] %></h1>

<div class="row">
  <div class="span6 offset3">

<table class="table table-hover table-condensed .table-responsive">
  <tr>
    <th>Product Price Group</th>
    <th>Product Name</th>
    <th>Discount</th>
    <th>UOM</th>
    <th>Price</th>
  </tr>

    <% @full_price_list.each do |full_price_list| %>
        <tr>
            <td><%= full_price_list.product_price_group %></td>
            <% @product_details = Product.find_by_product_price_group(full_price_list.product_price_group) %>
            <td><%= @product_details.product_name %>/td>
            <td><%= full_price_list.discount_value %>%</td>
            <td><%= full_price_list.unit_of_measure %></td>
            <% calculated_price(full_price_list.product_price_group) %>
            <td><%= number_to_currency(@dispatch_price - (@dispatch_price * (full_price_list.discount_value/100)),:unit => "$") %></td>
            </tr>
        <% end %>
    </table>

  </div>
</div>

我使用辅助方法根据循环中创建的值在循环内进行计算

module PriceListsHelper

def calculated_price(product_price_group)
    @dispatch_price = PriceList.where(:price_list =>         @dispatch_location,:product_price_group => product_price_group).first

    if @dispatch_price.nil? || @dispatch_price == 0
            @dispatch_price = 0
            else
            @dispatch_price = @dispatch_price.trade_price
        end
    end

    def product_details(product_price_group)
        @product_details = Product.find_by_product_price_group(product_price_group)
      end
end

我收到错误“未定义的方法`product_name'为nil:NilClass”但是如果我放置

<% fail %>

之间(我正在使用更好的错误进行调试)

<% @product_details = Product.find_by_product_price_group(full_price_list.product_price_group) %>
<td><%= @product_details.product_name %>/td>

在错误视图中我可以使用live shell调用@ product_details.product_name,它将完美地返回产品名称。一旦我删除了失败参数并让它正常运行,我就会收到错误。

任何想法可能会发生什么?就好像变量一直存在,直到我想要实际使用它。如此困惑:/任何想法都会非常感激。

我的gemfile如下:

source 'https://rubygems.org'
ruby '2.0.0'
#ruby-gemset=railstutorial_rails_4_0

gem 'rails', '4.0.2'
gem 'bootstrap-sass', '2.3.2.0'
gem 'bcrypt-ruby', '3.1.2'
gem 'pg', '0.15.1'
gem 'will_paginate', '3.0.4'
gem 'bootstrap-will_paginate', '0.0.9'
gem 'rails3-jquery-autocomplete'
gem 'simple_form'

group :development, :test do
  gem 'rspec-rails', '2.13.1'
  gem 'better_errors'
  gem 'binding_of_caller'
end

group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara', '2.1.0'
  gem 'factory_girl_rails', '4.2.1'
end

gem 'sass-rails', '4.0.1'
gem 'uglifier', '2.1.1'
gem 'coffee-rails', '4.0.1'
gem 'jquery-rails', '3.0.4'
gem 'turbolinks', '1.1.1'
gem 'jbuilder', '1.0.2'

group :doc do
  gem 'sdoc', '0.3.20', require: false
end

group :production do
  gem 'rails_12factor', '0.0.2'
end

1 个答案:

答案 0 :(得分:1)

1你找到了

@product_details = Product.find_by_product_price_group(full_price_list.product_price_group)

在迭代块中。换句话说,每次覆盖@product_details

时,都会多次这样做

2 find_by_...可以返回nil。

结论:至少有一个full_price_list没有product_price_group的产品。