【问题标题】:Unexpected ',' expecting ')' in update_attributes - Railsupdate_attributes 中出现意外的 ',' 期待 ')' - Rails
【发布时间】:2013-05-20 13:10:42
【问题描述】:

我正在尝试进行迁移,但遇到了一些麻烦。当我尝试在 Heroku 上运行“rake db:migrate”时,我收到一条错误消息。现在我在我的本地主机中发现我在迁移中的代码有问题 - 但我不知道是什么。

这是我迁移的代码:

def change
    add_column :comments, :likes_count, :integer, :default => 0
    Comment.all().each do |comment|
        comment.update_attribute(:likes_count, comment.likes.count)
        comment.save        
    end
  end

这是我在控制台上遇到的错误(当我尝试将此代码复制并粘贴到“rails 控制台”上时):

 SyntaxError: (irb):3: syntax error, unexpected ',', expecting ')'
c.update_attribute (:likes_count, comment.likes.count)
                                 ^
(irb):3: syntax error, unexpected ')', expecting keyword_end

有人可以帮助我吗?

---------- 编辑 ------------- --
奇怪的是:我已经在 localhost 上运行了此迁移,并且 localhost 中的所有内容都可以正常工作。但是当我尝试在 Heroku 上运行“rake db:migrate”时,我得到了一个错误 - 当我尝试在 rails 控制台上运行相同的代码时,我也得到了一个错误(如上所示)。

【问题讨论】:

    标签: ruby-on-rails ruby database activerecord


    【解决方案1】:

    首先,您需要重置列信息,以便表格在向其添加值之前知道其新列。

    http://apidock.com/rails/ActiveRecord/Base/reset_column_information/class

    Comment.all().each 中的 () 也不需要,Comment.all.each 也可以。您也不需要显式保存,update_attribute 会为您保存更改 (http://apidock.com/rails/ActiveResource/Base/update_attribute)

    最后,你的错误信息和你的代码不符,方法调用中有一个rogue space:

    c.update_attribute (:likes_count, comment.likes.count)
    

    删除那个空格

    c.update_attribute(:likes_count, comment.likes.count)
    

    看看会发生什么。

    编辑:修复后的迁移

    def change
      add_column :comments, :likes_count, :integer, :default => 0
    
      Comment.reset_column_information
    
      Comment.all.each do |comment|
        comment.update_attribute(:likes_count, comment.likes.count)      
      end
    end
    

    【讨论】:

    • 其实不用Comment.all.eachComment.each就更好了。
    • @Spajus,你确定吗? Comment 是一个类,而不是一个作用域。
    • 我仍然遇到问题:SELECT "cmets".* FROM "cmets" NameError: undefined local variable or method comment' for main:Object from (irb):6:in block in irb_binding' from (irb):5:in `each'
    • @Matt,你说得对,我的意思是Comment.find_each,它可以批量处理并在你的数据库上更轻松。 apidock.com/rails/ActiveRecord/Batches/ClassMethods/find_each
    • 我在 Heroku 上验证了我的代码,并在我的“cmets.rb”和“post.rb”中找到了这一行:attr_readonly :likes_count。我删除了这一行并迁移了数据库,令人惊讶的是:一切正常!谢谢大家。我会将这个答案标记为正确,因为我认为这是最好的答案,并且可以帮助更多的人。
    【解决方案2】:

    问题似乎是您在左括号和方法名称之间有一个空格。

    代替:

    comment.update_attribute (:likes_count, comment.likes.count)
    

    尝试:

    comment.update_attribute(:likes_count, comment.likes.count)
    

    错误消息还提到了c.update_attribute (:likes_count, comment.likes.count)。注意 c 而不是 comment

    所以,而不是:

    Comment.all().each do |c|
      c.update_attribute(:likes_count, comment.likes.count)
      c.save
    end
    

    做:

    Comment.all.each do |comment|
      comment.update_attribute(:likes_count, comment.likes.count)
    end
    

    请注意,不必执行comment.savecomment.update_attribute 将已经执行查询。

    【讨论】:

    • 我得到:SELECT "cmets".* FROM "cmets" NameError: undefined local variable or method comment' for main:Object from (irb):6:in block in irb_binding' from (irb):5:in `each'
    • @FernandoPaladini:我更新了我的答案。下次,请发布您的实际代码。不是您认为的代码。
    • 但是我发布了我的实际代码伙计,我没有改变任何东西,但我仍然遇到麻烦......(上面的问题)
    • @FernandoPaladini,如果那是您的实际代码,为什么错误消息显示c.update_attribute 而不是comment.update_attribute?您在其他地方使用c 吗?
    • @FernandoPaladini:不,这不是您的实际代码。您发布的错误消息不属于您发布的代码。错误消息包含发生错误的代码摘录,并且该摘录在您发布的代码中的任何位置都不存在。您发布了错误的代码或错误的错误。在您发布 actual 代码和 actual 错误之前,我们无能为力。
    【解决方案3】:

    试试这个

    def change
      add_column :comments, :likes_count, :integer, :default => 0
      Comment.all.each do |comment|
        comment.update_attribute('likes_count', comment.likes.count)
      end
    end
    

    【讨论】:

    • 得到:SELECT "cmets".* FROM "cmets" NameError: undefined local variable or method comment' for main:Object from (irb):10:in block in irb_binding' from (irb):9:in `each'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2016-09-11
    • 2015-08-19
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    相关资源
    最近更新 更多