该应用程序允许用户对给定的午餐进行投票并评估其整体表现。每个午餐都与提供商(餐厅)相关联,当用户访问提供商的页面时,用户会看到与该特定提供商相关的所有午餐的历史记录。反过来,每个提供者与给定的菜肴相关联。当用户对午餐进行投票时,与:lunchscore
关联的@lunch
值会更新。在providers/show.html.erb
页面中,我试图:
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列中的数据库。这并没有解决问题。
我仍然怀疑这个问题与数据类型或视图中的逻辑有关,但我不确定。
任何人都可以解释这个问题是什么,为什么它会使我的应用程序崩溃,以及我可以插入哪些条件逻辑来防止它发生?
答案 0 :(得分:1)
你可以避免这样的例外:
<% counter += lunch.lunchscore if lunch.lunchscore %>
但是,整个循环不应该在视图代码中,而应该在模型上 - 可能是Provider。