【发布时间】:2016-11-07 14:00:04
【问题描述】:
我有我的问题,有点解决了,但我认为它有点笨拙,所以希望得到一个更好的方法,以及更好地理解这里发生了什么。
_form.html.erb:
<%= select_tag(:category_id, options_for_select(@categories), :prompt => "Select one!") %>
products_controller.rb:
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!") %>
但我觉得有更好的方法。另外我认为,通过使用:selected 分配默认的select_tag 值可能也可以,但我无法根据我对Ruby 语法的了解来实现它...
【问题讨论】:
-
当您提交表单时,
create方法被执行,如果@product.save返回 false,请确保在create方法中初始化@categories。 -
哦,那很好。感谢您的回答。我添加了
if @product.save == false @categories = Category.all.map{|c| [ c.name, c.id ] } end来创建动作,看起来效果很好。很遗憾我无法将您的评论标记为答案... -
@dnsh 评论工作正常,但来自@SnehaT 的答案是更好的方法,因为它消除了对
@categories的需要......最好你应该有尽可能少的实例变量可以查看,理想情况下只有一个。