我在 Rails 应用程序中的 Microphoto 模型中有两个额外的整数字段::votes_up
和 :votes_down
。我没有在数据库中手动设置任何初始值。
这是在我的 Controller 中:
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
的使用应该有问题。我的一位 friend 也提到,问题可能是由于未为字段设置初始值 0
造成的。
已更新
又一个问题,一定是拼写错误,但我找不到它。 votes_up 链接可以正常工作并正确呈现,但 votes_down 不行! 未初始化常量 MicrophotosController::O
最佳答案
这里的问题是,实例 @microphoto
的属性 votes_up
为 nil
。
有几种方法可以解决这个问题:
#1:使用 after_create
回调为属性 votes_up
设置默认值:
class Microphoto < ActiveRecord::Base
after_create :set_defaults
#...
def set_defaults
self.votes_up = 0
self.votes_down = 0
self.save
end
#2:如果 votes_up 为 nil
,则使用零:
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)
要显示向上和向下的投票总数,在“显示”操作中,您可以执行以下操作:
#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 %>
关于ruby-on-rails - 更新属性 'undefined method ` +' for nil:NilClass',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17307207/