我有一个应用程序,其中我使用gems rails3-jquery-autocomplete
和nested_form
来建议现有用户被标记为项目条目的贡献者。
表单视图:
<%= f.fields_for :contributors do |contributor|%>
<%= contributor.autocomplete_field :name, autocomplete_user_profile_last_name_projects_path, :update_elements => { :user_id => "#user_id" } %><br>
<%= contributor.hidden_field :user_id %>
<%= contributor.radio_button :contributor_type, 'Colleague' %>
<%= contributor.radio_button :contributor_type, 'Supervisor' %>
<%= contributor.radio_button :contributor_type, 'Client' %>
<%= contributor.link_to_remove "Remove this contributor" %>
<% end %>
<%= f.link_to_add "Add a contributor", :contributors %><br>
我还覆盖了get_autocomplete_function(parameters)
函数,以便在我的自动填充功能中允许多个列,即列first_name
和last_name
def get_autocomplete_items(parameters)
items = UserProfile.select("DISTINCT CONCAT_WS(' ', first_name, last_name ) AS full_name, first_name, last_name, id, user_id").where(["CONCAT_WS(' ', first_name, last_name) LIKE ?", "%#{parameters[:term]}%"])
end
我的Projects控制器中还有以下行:
autocomplete :user_profile, :last_name, :full => true, :extra_data => [:first_name, :last_name, :user_id ], :display_value => :fullname
使用`fullname'功能只需:
def fullname
"#{first_name} #{last_name}"
end
我想要做的是从自动填充项中获取user_id
的值,并将其值放在隐藏字段中,但是当我检查服务器时,它会输出如下内容:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"DYQ7iJeqdwMQrprSGn0WNHXY5iXDZLA5pUd3OlYJ2so=", "project"=>{"creator"=>"1", "title"=>"lesdodis", "contributors_attributes"=>{"0"=>{"name"=>"Test User the 1st", "user_id"=>"", "contributor_type"=>"Client", "_destroy"=>"false", "id"=>"21"}, "1"=>{"name"=>"Test User the 2nd", "user_id"=>"", "contributor_type"=>"Supervisor", "_destroy"=>"false", "id"=>"22"}, "1393677266696"=>{"name"=>"", "user_id"=>"", "_destroy"=>"1"}, "1393677267518"=>{"name"=>"", "user_id"=>"", "_destroy"=>"1"}}, "description"=>"asdad", "tag_list"=>"sdads", "link"=>"asdasd", "gallery_attributes"=>{"screenshots_attributes"=>{"0"=>{"description"=>"", "_destroy"=>"false", "id"=>"10"}}, "id"=>"16"}}, "commit"=>"Update", "id"=>"16"}
其中贡献者中的user_id
字段留空。我已经尝试通过使用contributor.object.id
为字段名称分配唯一编号而手动为这些字段分配ID,但成功有限,因为新动态添加的字段没有对象ID。我正在使用此表单来创建和更新项目条目,因此无论是编辑字段还是添加新字段,我都想请求如何使其工作。
更新: 经过一段时间的搜索,我终于通过添加此代码来实现它的工作
<% field_name = "#{contributor.object_name}[user_id]".gsub(/(\])?\[/, "_").chop %>
<%= contributor.autocomplete_field :name, autocomplete_user_profile_last_name_projects_path, :update_elements => { :user_id => "##{field_name}" } %><br>
我希望这可以帮助任何可能遇到同样问题的人。
答案 0 :(得分:1)
我也一直在努力解决类似的问题。在您的情况下,我的感觉是nested_form助手正在生成唯一标识符,这些标识符会使传递给:update_elements的“#user_id”选择器失败。
您可以通过挂钩每个gem的事件流然后手动更新表单中特定贡献者的hidden:user_id来解决此问题。对于动态添加的贡献者,可能类似于:
$(document).on('nested:fieldAdded', function(nf_event) {
var ac_input = nf_event.field.find('.ui-autocomplete-input');
ac_input.bind('railsAutocomplete.select', function(ac_event, data) {
$(this).next('input[type=hidden]').val(data.item.id);
});
});
对于通过现有关联生成的贡献者(即编辑),您可以绑定到$(document).ready()上的自动完成输入。这至少可以让你指向正确的方向。
答案 1 :(得分:1)
经过一段时间的搜索,我终于通过添加此代码
来实现它<% field_name = "#{contributor.object_name}[user_id]".gsub(/(\])?\[/, "_").chop %>
<%= contributor.autocomplete_field :name, autocomplete_user_profile_last_name_projects_path, :update_elements => { :user_id => "##{field_name}" } %>
我希望这可以帮助任何可能遇到同样问题的人。