我在Rails应用程序的Microphoto模型中有两个额外的整数字段:votes_up
和:votes_down
。我没有手动在DB中设置任何初始值。
这是在我的控制器中:
def vote_up
@microphoto = Microphoto.find(params[:id])
@microphoto.update_attribute(:votes_up, @microphoto.votes_up + 1)
redirect_to root_path
end
def vote_down
@microphoto = Microphoto.find(params[:id])
@microphoto.update_attribute(:votes_down, @microphoto.votes_down + 1)
redirect_to root_path
end
这在我看来:
<%= link_to "vote up", vote_up_microphotos_url(feed_item.id), :method => :put %>
<%= link_to "vote down", vote_down_microphotos_url(feed_item.id), :method => :put %>
但是,当我点击例如,投票链接时,它会给我错误:
NoMethodError in MicrophotosController#vote_up
undefined method `+' for nil:NilClass
我认为update_attribute
的使用应该存在问题。我的一位朋友也提到,问题可能是因为没有为字段设置0
的初始值。
已更新
另一个问题,必须是拼写错误,但我找不到它。 votes_up链接正常工作并正确呈现但投票结果不是! uninitialized constant MicrophotosController::O
答案 0 :(得分:2)
此处的问题:实例votes_up
的属性@microphoto
为nil
。
有几种解决方法:
#1:为votes_up
回调设置属性after_create
设置默认值:
class Microphoto < ActiveRecord::Base
after_create :set_defaults
#...
def set_defaults
self.votes_up = 0
self.votes_down = 0
self.save
end
如果votes_up为nil
,则#2:使用零:
nil || 10 #=> returns 10 (try it in your console!)
# in your case:
(@microphoto.votes_up || 0) + 1
# the full line:
@microphoto.update_attribute(:votes_up, (@microphoto.votes_up || 0) + 1)
显示总票数和&amp;向下,在您的“显示”操作中,您可以执行以下操作:
#in controller
def show
@microphoto = Microphoto.find(params[:id])
end
#in view
Total of votes up: <%= @microphoto.votes_up %>
Total of votes down: <%= @microphoto.votes_down %>
<%= link_to "vote up", vote_up_microphotos_url(feed_item.id), :method => :put %>
<%= link_to "vote down", vote_down_microphotos_url(feed_item.id), :method => :put %>
答案 1 :(得分:0)
如果您只是将initialize方法的votes_up
和votes_down
的值设置为0,那么您的代码应该可以正常工作。您可能还需要使用默认值更新数据库。