我正在研究在Ruby on Rails上创建表单,但是我似乎不知道如何使用options_for_select返回想要的值。
我想检索所有位置编号+每次用户创建一个新的“主题”时在最后一个编号上加1作为选择选项。
例如用户创建一个新的主题 在“表单”字段中的“位置”。选项将是1,2,3(在数据库中检索的数字)和4(是尚未在数据库中的新数字)
我成功尝试了分别检索数据库值和“其他”值,但是我无法将它们结合在一起以在同一选项字段中一起返回。
但是,我可以将它们加在一起,但是实例变量是手动一个接一个地添加的。
这是代码... 在视图和控制器中
<%= f.select(:position, options_for_select([@position, @positionTwo.position, @position.last, @additional])) %>
@position = Subject.pluck(:position)
@positionTwo = Subject.find(2)
@additional = Subject.pluck(:position).size + 1
产生 选项1,2,3,4,但结果是手动添加的
我成功尝试使用以下方法检索数据库值:
<%= f.select(:position, options_for_select(@position)) %>
@position = Subject.pluck(:position)
这会生成选项1,2,3
表示“其他”值
<%= f.select(:position, options_for_select(@additional)) %>
@additional = Subject.pluck(:position).size + 1
它生成选项4
我的预期行为和结果应该是什么
选项1,2,3,4动态生成
从数据库中检索1,2,3,而4是一个动态数,具体取决于数据库中的最后一个位置编号+1(3 + 1 = 4)
答案 0 :(得分:1)
如果我明白了这一点,例如以@position = Subject.pluck(:position)
从Subject抓取,您最终会得到:
@position = [1,2,3]
然后,您需要附加一个元素,该元素的值是最后一个加1的元素。
对于Ruby 2.6,您可以尝试使用Object#then:
[1,2,3].then { |ary| ary << ary.last + 1 } #=> [1, 2, 3, 4]
因此,在您的情况下,这应该可行:
@position = Subject.pluck(:position).then { |positions| positions << positions.last + 1 }
对于Ruby 2.5,请使用Object#yield_self。
答案 1 :(得分:1)
我认为上述iGian解决方案很好。但是他从新版本的Ruby中引入了一些新方法。如果您还需要一个可以与较低版本(以及新版本)一起使用的解决方案,请尝试以下操作:
Proc.new { |arr| arr << arr.last + 1 }.call(Subject.pluck(:position))
# or
lambda { |arr| arr << arr.last + 1 }.call(Subject.pluck(:position))
希望这会有所帮助
答案 2 :(得分:0)
更新:这是正确的答案,或做我想要的正确方法。
实际上我们可以简单地做到这一点的代码只是复杂而已... 在表单视图中:
<%= f.select :position, 1..@subject_count %>
然后在控制器中:
@subject_count = Subject.count + 1
这将生成数据库计数+ 1,而不会检索任何重复的(数字)位置… 就这样!多么神奇,它应该多么简单。