如何在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行生成了一个带有大量引号的句子,所以使用的jescape_javascript相同,它用于格式化句子,以便JavaScript可以正确读取它。