Rails select_tag undefined方法`map'为零:NilClass

时间:2016-11-07 14:00:04

标签: ruby-on-rails form-for

我有我的问题,有点解决,但我认为它有点笨拙的方式,所以希望得到一个更好的方式,以及更好的理解这里发生了什么。

_form.html.erb:

docker

products_controller.rb:

SELECT 
    Percentage_of_Marks,mark,test_id, 
    1+
    (
        SELECT count(*) 
        from user_test a 
        WHERE a.Percentage_of_Marks > b.Percentage_of_Marks
    ) as RNK, 
    Percentage_of_Marks 
FROM user_test b 
where b.test_id='$test_id'  
ORDER BY b.Percentage_of_Marks DESC limit 1

如果用户在未选择任何 <%= select_tag(:category_id, options_for_select(@categories), :prompt => "Select one!") %> 选项的情况下提交表单,则会收到def new @product = Product.new @categories = Category.all.map { |c| [ c.name, c.id ] } end 错误。

我知道它来自我的select_tag undefined method 'map' for nil:NilClass,但我无法想象如何避免这种情况......?

我的最终解决方案,即工作:

@categories

但我觉得有更好的方法。另外我认为,通过使用nil分配默认的<%= select_tag(:category_id, options_for_select(@categories || Category.all.map { |c| [ c.name, c.id ] }), :prompt => "Select one!") %> 值可能也可以,但我不能用我的Ruby语法知识来实现​​它...

2 个答案:

答案 0 :(得分:3)

请尝试使用select_tag的方式:

select_tag(:category_id, options_from_collection_for_select(Category.all, :id, :name), include_blank: "Select Category")

如果您遇到任何问题,请告诉我。

答案 1 :(得分:0)

是的,你可以使用辅助方法而不是在每个视图中使用Category.all

def categories
  Category.all.map { |c| [ c.name, c.id ] }
end

并在视图中使用

<%= select_tag(:category_id,
               options_for_select(categories), 
               include_blank: "Select Category") %>