我一直在看这个,没有运气。
我正在使用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}"
答案 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}"
感谢所有回复,我学到了很多东西!