Rails:如何自动完成搜索名称但保存ID?

时间:2012-11-18 18:11:13

标签: ruby-on-rails ruby ruby-on-rails-3 jquery-ui activerecord

我已使用此视频http://railscasts.com/episodes/102-auto-complete-association-revised在我的应用的表单中设置自动填充搜索输入。 (视频可能只适用于会员,所以我也会发布我的代码。基本上它会搜索数据库(名称)的一列,并在键入时自动填充下拉列表。这一切都正常,但是,我想要的是要执行的表单是提交与名称相关的ID,而不是名称本身。

我假设在视图中没有简单的方法可以做到这一点。任何帮助都会很棒。下面的代码,让我知道是否有任何其他代码会有所帮助。

谢谢

控制器:

def game_name
  game.try(:name)
end

def game_name=(name)
  self.game = Game.find_by_name(name) if name.present?
end

咖啡:

jQuery ->
 $('#play_game_name').autocomplete
  source: $('#play_game_name').data('autocomplete-source')

在视图中:

   <%= f.label :game_name, "Search for a game" %>
   <%= f.text_field :game_name, :class => "mlm mtm", data: {autocomplete_source: Game.order(:name).map(&:name)} %> 

2 个答案:

答案 0 :(得分:11)

除了建议@LukasSvoboda之外,您还可以覆盖select event回调,当您从下拉列表中选择项目时会触发该回调。在回调中,您可以将文本字段(不需要提交)设置为所选项目的“标签”,并将游戏ID的隐藏字段的值(需要提交)设置为所选项目的“价值”。

在咖啡中:

jQuery ->
  $('#play_game_name').autocomplete
    source: $('#play_game_name').data('autocomplete-source')
    select: (event, ui) ->

    # necessary to prevent autocomplete from filling in 
    # with the value instead of the label
    event.preventDefault()

    $(this).val ui.item.label
    $('#game_id').val ui.item.value

在标记中:

<%= text_field_tag nil, nil, :id => 'play_game_name', :class => "mlm mtm", data: {autocomplete_source: Game.order(:name).map { |t| { :label => t.name, :value => t.id } } %>
<%= f.hidden_field :game_id, id: 'game_id' %> # tailor to your model

答案 1 :(得分:3)

通过http://api.jqueryui.com/autocomplete/#option-source,您可以将数据设置为自动完成功能。

您需要更改text_field行,如:

<%= f.text_field :game_name, :class => "mlm mtm", data: {autocomplete_source: Game.order(:name).map { |t| { :label => t.name, :value => t.id } } %>

有关更多高级功能,请考虑使用select2或选择。