使用best_in_place gem如何为select标签指定nil值?

时间:2012-11-30 17:17:06

标签: ruby-on-rails ruby-on-rails-3 best-in-place

this question上的答案为我提供了一个很好的路线图,说明如何使用关联中的集合中的数据生成选择标记。

这很好用,一切都很顺利。

我现在遇到的问题是,如何处理空集合?

使用常规:type => :input,我只需指定:nil => "Some nil message here"

但这似乎不适用于集合,更糟糕的是,当集合中没有任何内容时,它似乎显示了一些整数(即12)。我假设那些是以前在集合中显示的对象的ID,但是由于显而易见的原因没有多大意义。

关于如何用这个宝石处理空集合的任何想法?

感谢。

修改1:

另一种方法是将原始的best_in_place帮助器标记放在if语句中,以便在集合不为零时使用。但是,当用户空白时,用户如何编辑它?也许可能无法处理这个问题,因为它涉及在集合中创建一个新记录。

1 个答案:

答案 0 :(得分:2)

我对select标签中的空选项使用“解决方法”,它可以帮助您:

:type => :select, :collection => @my_colletion || [[I18n.t('common.none'), -1]]

@my_colletion为nil时,它会显示一个名为'None'的选项,其id = -1(在后端处理并不坏)。

这部分代码假设@my_collection是一个数组数组,如[ [key, value], [key, value], ... ]或者没有。

但是,如果您希望MyModel.all集合符合best_in_place的条件,则可以使用以下内容:

@my_collection = MyModel.all.map{ |object| [object.name, object.value] } 
# => this returns an array like [ [key, value], [key, value], ... ]
# => returns an empty array (NOT nil) if there is no entry in the DB

关于-1 id: 将-1 id用作'none'很简单,因为您不需要显式处理值nil(tests等)。使用-1 id,您可以使用以下内容:

MyModel.where(id: params[:id]).first # => Returns the first object that has the params[:id]
# if params[:id] is -1, it will return nil and not raise an error.

我希望它有所帮助:)。