jQuery UI Rails 中的自动完成链接
jQuery UI autocomplete links in Rails
我在我的 Rails 应用程序中实现了 jQuery-ui 自动完成,它工作正常,但我还希望结果是产品的链接(例如 products/1).知道我该怎么做吗?
jQuery coffeescript 中的代码:
$(document).on "page:change", ->
$(".header-search-input").autocomplete(
minLength: 2,
source: $(".header-search-input").data('autocomplete-source')
select: (event, ui) ->
$(".header-search-input").val ui.item.label
).autocomplete('instance')._renderItem = (ul, item) ->
result = item.label.replace(new RegExp('(?![^&;]+;)(?!<[^<>]*)(' + $.ui.autocomplete.escapeRegex(@term) + ')(?![^<>]*>)(?![^&;]+;)', 'gi'), '<strong></strong>')
$('<li>').append('<a>' + result + '</a>').appendTo ul
return
查看:
<ul class="nav navbar-nav navbar-left" id="header-search">
<%= form_tag search_path, class: "navbar-form navbar-left list-inline", method: :get do |f| %>
<li class="form-group">
<%= text_field_tag :q, params[:q], class: "form-control margdown header-search-input", placeholder: "Search", data: { autocomplete_source: products_path(:json) } %>
</li>
<li><%= submit_tag "Submit", class: "btn btn-info shake", name: nil %></li>
<% end %>
</ul>
控制器:
def index
if params[:term]
@products = Product.order(:name).where(Product.arel_table[:name].matches("%#{params[:term]}%"))
response = (Hash[@products.map { |u| [u.name, u.id] }])
else
@products = Product.all.where.not(quantity: 0).order(created_at: :desc).paginate(page: params[:page], per_page: 9)
end
respond_to do |format|
format.html
format.json { render json: response.keys }
end
end
我已经创建了一个散列,正如您在控制器中看到的那样,其中包含成对的名称和 ID,以获取视图中相应产品名称的 ID。 (你可以忽略它只是一个想法。)问题是我不知道该怎么做。
终于找到解决办法了。我 post 它以防将来有人需要这样的东西。
首先在 'config/initializers/wrap_parameters.rb' 中,我取消注释以下内容:
ActiveSupport.on_load(:active_record) do
self.include_root_in_json = true
end
您可以阅读更多相关内容 here and here。
现在控制器的 json 响应格式如下:
"[{\"product\":{\"id\":20,\"name\":\"Andrew Beer\"}},{\"product\...]"
控制器:
def index
if params[:term]
@products = Product.order(:name).where(Product.arel_table[:name].matches("%#{params[:term]}%"))
else
@products = Product.all.where.not(quantity: 0).order(created_at: :desc).paginate(page: params[:page], per_page: 9)
end
respond_to do |format|
format.html
format.json { render json: @products, only: [:id, :name] }
end
end
现在我们可以访问 js 文件中的两个参数(id 和 name)。
jQuery:
$(document).on "page:change", ->
$(".header-search-input").autocomplete(
minLength: 2,
source: $(".header-search-input").data('autocomplete-source')
select: (event, ui) ->
$(".header-search-input").val ui.item.product.name
$("a").attr("href", "/products/"+ ui.item.product.id)
).autocomplete('instance')._renderItem = (ul, item) ->
result = item.product.name.replace(new RegExp('(?![^&;]+;)(?!<[^<>]*)(' + $.ui.autocomplete.escapeRegex(@term) + ')(?![^<>]*>)(?![^&;]+;)', 'gi'), '<strong></strong>')
$('<li>').append('<a>' + result + '</a>').appendTo ul
return
我在我的 Rails 应用程序中实现了 jQuery-ui 自动完成,它工作正常,但我还希望结果是产品的链接(例如 products/1).知道我该怎么做吗?
jQuery coffeescript 中的代码:
$(document).on "page:change", ->
$(".header-search-input").autocomplete(
minLength: 2,
source: $(".header-search-input").data('autocomplete-source')
select: (event, ui) ->
$(".header-search-input").val ui.item.label
).autocomplete('instance')._renderItem = (ul, item) ->
result = item.label.replace(new RegExp('(?![^&;]+;)(?!<[^<>]*)(' + $.ui.autocomplete.escapeRegex(@term) + ')(?![^<>]*>)(?![^&;]+;)', 'gi'), '<strong></strong>')
$('<li>').append('<a>' + result + '</a>').appendTo ul
return
查看:
<ul class="nav navbar-nav navbar-left" id="header-search">
<%= form_tag search_path, class: "navbar-form navbar-left list-inline", method: :get do |f| %>
<li class="form-group">
<%= text_field_tag :q, params[:q], class: "form-control margdown header-search-input", placeholder: "Search", data: { autocomplete_source: products_path(:json) } %>
</li>
<li><%= submit_tag "Submit", class: "btn btn-info shake", name: nil %></li>
<% end %>
</ul>
控制器:
def index
if params[:term]
@products = Product.order(:name).where(Product.arel_table[:name].matches("%#{params[:term]}%"))
response = (Hash[@products.map { |u| [u.name, u.id] }])
else
@products = Product.all.where.not(quantity: 0).order(created_at: :desc).paginate(page: params[:page], per_page: 9)
end
respond_to do |format|
format.html
format.json { render json: response.keys }
end
end
我已经创建了一个散列,正如您在控制器中看到的那样,其中包含成对的名称和 ID,以获取视图中相应产品名称的 ID。 (你可以忽略它只是一个想法。)问题是我不知道该怎么做。
终于找到解决办法了。我 post 它以防将来有人需要这样的东西。
首先在 'config/initializers/wrap_parameters.rb' 中,我取消注释以下内容:
ActiveSupport.on_load(:active_record) do
self.include_root_in_json = true
end
您可以阅读更多相关内容 here and here。 现在控制器的 json 响应格式如下:
"[{\"product\":{\"id\":20,\"name\":\"Andrew Beer\"}},{\"product\...]"
控制器:
def index
if params[:term]
@products = Product.order(:name).where(Product.arel_table[:name].matches("%#{params[:term]}%"))
else
@products = Product.all.where.not(quantity: 0).order(created_at: :desc).paginate(page: params[:page], per_page: 9)
end
respond_to do |format|
format.html
format.json { render json: @products, only: [:id, :name] }
end
end
现在我们可以访问 js 文件中的两个参数(id 和 name)。
jQuery:
$(document).on "page:change", ->
$(".header-search-input").autocomplete(
minLength: 2,
source: $(".header-search-input").data('autocomplete-source')
select: (event, ui) ->
$(".header-search-input").val ui.item.product.name
$("a").attr("href", "/products/"+ ui.item.product.id)
).autocomplete('instance')._renderItem = (ul, item) ->
result = item.product.name.replace(new RegExp('(?![^&;]+;)(?!<[^<>]*)(' + $.ui.autocomplete.escapeRegex(@term) + ')(?![^<>]*>)(?![^&;]+;)', 'gi'), '<strong></strong>')
$('<li>').append('<a>' + result + '</a>').appendTo ul
return