Rails if语句错误:" nil不能被强制转换为Fixnum"

时间:2015-03-23 02:55:51

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

该应用程序允许用户对给定的午餐进行投票并评估其整体表现。每个午餐都与提供商(餐厅)相关联,当用户访问提供商的页面时,用户会看到与该特定提供商相关的所有午餐的历史记录。反过来,每个提供者与给定的菜肴相关联。当用户对午餐进行投票时,与:lunchscore关联的@lunch值会更新。在providers/show.html.erb页面中,我试图:

  1. 验证用户是否与提供商关联的午餐
  2. 添加给定提供商的所有午餐核心
  3. 将午餐总分数除以午餐分数以获得平均分数
  4. show.html.erb

    <% @provider.lunches.count %>
    <% if @provider.lunches.count > 0 %> 
           <% counter = 0 %>
           <% @lunches.each do |lunch| %>
           <% counter += lunch.lunchscore %> 
        <% end %>
    <!-- counter = counter + lunch.lunchscore -->
        <% provider_score = counter / @provider.lunches.count.round %>
        <% end %>
    

    provider.rb

    class Provider < ActiveRecord::Base
    belongs_to :cuisine
    has_many :lunches
    validates :name, presence: true, uniqueness: true
    validates :cuisine, presence: true
    end
    

    lunch.rb

    class Lunch < ActiveRecord::Base
    belongs_to :provider
    default_scope -> { order('created_at DESC') }
    validates :date, presence: true, uniqueness: true
    validates :provider_id, presence: true
    end
    

    为了完成起见,这是我的(截断的)控制器:

    providers_controller.rb

      def show
        @provider = Provider.find(params[:id])
        @lunches = @provider.lunches
        @cuisine = @provider.cuisine
      end
    
      def create
        @provider = Provider.new(provider_params)
        if @provider.save
            flash.now[:success] = "New Provider Added!"
            redirect_to providers_path
        else
            render 'new'
        end
      end
    

    lunches_controller.rb

      def create
        @lunch = Lunch.new(lunch_params)
            if @lunch.save 
                flash.now[:success] = "New Lunch Added!"
                redirect_to lunches_path
            else
                render 'new'
            end
        end
            private
                def lunch_params
                    params.require(:lunch).permit(:date, :liked, :disliked, :enough, :not_enough, :provider_id, :lunchscore)
                end
    

    当我尝试执行上述操作时,收到此错误:"nil can't be coerced into Fixnum"此错误与<% counter += lunch.lunchscore %>一致。

    如果没有设置初始午餐分数,我认为show.html.erb页面中的代码会中断,我尝试通过{{1}设置1的值} form_for,或者将hidden_field直接写入lunchscore列中的数据库。这并没有解决问题。

    我仍然怀疑这个问题与数据类型或视图中的逻辑有关,但我不确定。

    任何人都可以解释这个问题是什么,为什么它会使我的应用程序崩溃,以及我可以插入哪些条件逻辑来防止它发生?

1 个答案:

答案 0 :(得分:1)

你可以避免这样的例外:

<% counter += lunch.lunchscore if lunch.lunchscore %>

但是,整个循环不应该在视图代码中,而应该在模型上 - 可能是Provider。