【问题标题】:Passing an attribute name as an argument in a method not working in Rails在 Rails 中不起作用的方法中将属性名称作为参数传递
【发布时间】:2017-04-14 12:15:09
【问题描述】:

我正在尝试在模型中定义一个方法来简化我在控制器中所做的事情,如下所示:

models/game.rb

def build_array_for(words)
  words.downcase.split(",")
end

我在控制器中调用方法如下

games_controller.rb

@wordsArray = @game.build_array_for(red_words)

请注意,'red_words' 是 Game 实例的属性,其值应该是字符串

当我调用我得到的方法时:

GamesController 的未定义局部变量或方法 `red_words'

如果我将方法构建为:

def build_array
  red_words.downcase.split(",")
end

它有效,但由于我将它与其他属性一起用于相同目的,所以没有意义。

我在这里遗漏了什么,可能是参数作为字符串传递,并且由于某种原因无法识别属性的名称?

【问题讨论】:

    标签: ruby-on-rails methods model helpers


    【解决方案1】:

    如果您需要为现有列构建数组,那么您可以试试这个:

    def build_array_for(column)
      self[column].downcase.split(",")
    end
    

    如果您想在以下情况下为任何实例变量构建数组:

    def build_array_for(name)
      self.send(name).downcase.split(",")
    end
    

    使用符号或字符串作为参数:

    @wordsArray = @game.build_array_for(:red_words)
    

    【讨论】:

    • 不走运,亚历克斯,两种选择都会产生相同的错误
    • 这样称呼@wordsArray = @game.build_array_for(:red_words)
    • 这很好,Alex 现在很好用。非常感谢您的帮助!
    【解决方案2】:

    将方法改为

    def build_array_for(words)
      words.downcase.split(",")
    end
    

    当您使用self 时,rails 将尝试为Game 对象查找属性words 或实例方法words

    编辑

    进行相应的更改

    games_controller.rb

    @wordsArray = @game.build_array_for(red_words)
    

    models/game.rb

    def build_array(red_words)
      red_words.downcase.split(",")
    end
    

    【讨论】:

    • 结果是一样的。我认为在Ruby中使用'self'是否相同?在这两种情况下,都试图找到一个实例方法,该方法采用 Game 对象的参数 'words' 的值。在这两种情况下,我都会得到“未定义的局部变量或方法‘red_words’”
    • 如果不是attributeassociation,则必须将其作为参数传递
    • 确保您通过方法调用传递参数并接受方法中的参数
    • 是的,我之前尝试过不使用 'self' 作为您上面的代码。但是,我遇到了同样的错误(我会从问题中去掉“自我”以免混淆)。
    • 不确定我是否遵循您的思路。 'red_words' 绝对是 Game 实例的属性,如果我调用 @game.red_words 一切正常。
    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    相关资源
    最近更新 更多