如何在javascript中使用ruby代码
我正在实现一个带有下拉列表的实时搜索,其中包含要过滤的多个字段。当用户单击按钮时,它只从一个搜索字段开始,下拉选择要搜索的内容以及添加更多filter的按钮,它生成一个像这样的新字段:
这个图像样本是用JavaScript中的html进行硬编码的。 问题是我将在很多视图中使用它,所以我需要它是动态的,因为我以前使用Ruby生成第一个搜索字段的代码。 我尝试过这样做,但没有成功。
live_search.js.erb
$(function () { function search() { $.get(window.location.href, { object_columns: $("select#object_columns").val(), search: $("#search").val() }, null, "script"); }; $("select#object_columns").change(search); $("input#search").keyup(search); $('button').on('click',function(){ column = ""; $('#search-form').after(column); }); });
search_engine.html.erb
我甚至试图在JavaScript中调用“搜索表单”来复制单击按钮时的代码,但我读到它是不可能的。
编辑
我在@ppascualv建议时做了一些更改,但是当我点击按钮时,我仍然无法渲染并添加另一个“search_engine”。 我收到一个错误,说未定义的方法’render’ 。
live_search.js.erb
$(function () { function search() { $.get(window.location.href, { object_columns: $("select#object_columns").val(), search: $("#search").val() }, null, "script"); }; $("select#object_columns").change(search); $("input#search").keyup(search); $('button').on('click',function(){ $('button').append(""); }); });
search_engine.html.erb
house_activities_controller.rb
class HouseActivitiesController < ApplicationController before_action :set_house_activity, only: [:show, :edit, :update, :destroy] def index @house_activities = HouseActivity.page(params[:page]).per(5).search_for(params[:object_columns], params[:search]) respond_to do |format| format.js format.html end end end
你应该看看带有Rails的Javascript ,为了实现你的建议你需要创建一个用你的js.erb响应的控制器,这个动作应该从data-remote=true
或ajax的链接调用。
你可以这样做:
search_engine.html.erb
<%= form_tag(target_path, method: :get) do %> <%= text_field_tag :query, nil, placeholder: "Search by column names...", class: "form-control search-form" %> <% end %>
live_search.js
$(document).on("change", ".search-form", function() { return $(this).parents("form").submit(); });
然后在目标模型中,您可以添加search
范围以使其动态化。
target.rb
class Target < ActiveRecord::Base scope :search, -> (query) { return if query.blank?; where("target.column_name1 ILIKE :query or target.column_name2 ILIKE :query or target.column_name3 ILIKE :query", query: "%#{query}%") } end
在您的targets_controller.rb中
class TargetsController < ApplicationController def search_engine @targets = Target.search(params[:query]) end end
我能够解决我的问题。 我发现你不能在资产中渲染东西,也不能在JavaScript文件中使用ruby。 我做了一些解决方法并完成了它,我使用语法将JavaScript代码包含在html.erb文件中,如下所示:
因为select_tag ruby行生成了一个带有大量引号的句子,所以使用的j与escape_javascript相同,它用于格式化句子,以便JavaScript可以正确读取它。