2

我有两个额外的整数字段,:votes_up并且:votes_down在 Rails 应用程序中的 Microphoto 模型中。我没有在数据库中手动设置任何初始值。

这是在我的控制器中:

  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 链接可以正常工作并正确呈现,但 votes_down 不能!uninitialized constant MicrophotosController::O

4

2 回答 2

2

这里的问题是votes_up您的实例属性@microphotonil.

几种方法可以解决这个问题

votes_up#1:使用after_create回调设置属性的默认值:

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)

要显示 up & down 的总票数,在您的 Show 操作中,您可以执行以下操作:

#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 %>
于 2013-06-25T20:56:01.730 回答
0

如果您只是将initialize 方法的votes_up和的值设置为 0,那么您的代码应该可以工作。votes_down您可能还需要使用默认值更新数据库。

于 2013-06-25T20:51:46.563 回答