ruby-on-rails - 更新属性 'undefined method ` +' for nil:NilClass'

标签 ruby-on-rails database model controller

我在 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_upnil

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

#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/

相关文章:

mysql按多数票排序

ruby-on-rails - #<#<Class :0x000000035ab3f8>:0x0000000344f220> 的未定义方法 `charities_path'

php - 如何使用 symfony2 中其他 2 个表的主键创建一个表?

java - 带有 DefaultComboBoxModel 的 JComboBox 不允许添加或删除

laravel-5 - 如何在 Eloquent 中获得相关模型列的总和

ruby-on-rails - 如何在Rails 5中的RSpec中期待Params哈希?

ruby-on-rails - 为什么当属性更新为 nil 时不触发 before_save/after_save?以及如何触发?

python - 如何在Python中连接2个查询

java - 主应用程序的软件集成和共享数据库

python - 如何解决这个 django OneToOneField 模型错误?