ruby on rails,instance_variable_set'variable'不允许作为实例变量名

时间:2015-04-14 15:00:29

标签: ruby-on-rails

我一直在看这个,没有运气。

我正在使用Ruby on Rails。我试图使用.each迭代数组并使用每个元素来设置变量名称。具体来说,变量将控制表单上的复选框是否显示为已选中。

我一直收到这个错误:`@ PG-13_check'不允许作为实例变量名 似乎先前涉及此错误的问题围绕未能使用@声明实例变量。但我已经把它包括在内了。

型号:

class Movie < ActiveRecord::Base 
  attr_accessible, :title, :rating, :description, :release_date 
  def self.ratings 
    ratings = [G, PG, PG-13, R] 
  end
 end

控制器代码:

@movies = Movie.all
@all_ratings = Movie.ratings
@all_ratings.each do |x| 
  instance_variable_set("@#{x}_check", "true")
end

反过来,该视图显示:

= check_box_tag "ratings[#{rating}]", 1, checked = @#{rating}_check, :id => "ratings_#{rating}"  

2 个答案:

答案 0 :(得分:0)

只需双重检查,Ruby变量不允许使用连字符。只有数字,字母和下划线 - 即,如果它与/[a-zA-Z_][a-zA-Z0-9_]*/不匹配,则它不是允许的变量名。这意味着您无法声明名为PG-13_check的变量。但是,您可以声明一个名为PG13_check的名称,其中(IMO)足够清晰。您可以使用String#gsub

的非常简单的应用程序来实现这一点
x.gsub('-', '')

所以在你的代码中,这看起来像是:

@all_ratings.each do |x| 
  instance_variable_set("@#{x.gsub('-', '')}_check", "true")
end

如果你想将它转换回原始形式,你可以使用类似的东西:

@all_ratings.each do |x| 
  instance_variable_set("@#{x.gsub('-', '_')}_check", "true")
end

然后,要获得x,您可以获取字符串形式并使用:

variable_name.split('_')[1..-2].join('_').gsub '_', '-'

这可能不是最有效的方式,但这是我想到的第一个。它的作用是删除最后的_check.split('_')[1..-2].join('_')),然后将所有_替换为-

答案 1 :(得分:0)

我是一个初学者,所以我希望我不会因为错过太明显的事情而感到沮丧,因此浪费了每个人的时间。但我最终只是在我的check_box标签中添加了一个条件语句,完成了我的任务。这是针对edx课程的,所以我不会给出实际的答案。这是为了:

= check_box_tag "ratings[#{rating}]", 1, checked = does the params hash includes the rating that was checked true ? false, :id => "ratings_#{rating}"

感谢所有回复,我学到了很多东西!