在Rails中,如何使用多个按钮创建一个单独的搜索表单,每个按钮都路由到不同的控制器?

时间:2015-10-30 00:29:40

标签: ruby-on-rails forms routes

在我看来,我想用两个按钮创建一个单一的搜索字段。点击第一个后,我想在搜索字段中使用字符串来搜索用户。当我单击第二个按钮时,我想使用字段中的字符串来搜索帖子。

我认为解决方案应该是这样的:

<%= form_tag([users_path, posts_path], method: 'get', id: 'search-form') do %>
  <%= text_field_tag(:search, params[:search], id: 'search-field', placeholder: "Search") %>
  <%= button_tag(:id => "search-user-btn", :controller => :users) do %>
    <i class="icon-search-user"></i>
  <% end %>
  <%= button_tag(:id => "search-post-btn", :controller => :posts) do %>
    <i class="icon-search-post"></i>
  <% end %>
<% end %>

是否可以有一个text_field并分享两个按钮,每个按钮为不同的控制器路由(在这种情况下是用户和帖子)?

我该怎么做?

2 个答案:

答案 0 :(得分:3)

在视图中:

<%= form_tag([users_path, posts_path], method: 'get', id: 'search-form') do %>
  <%= text_field_tag(:search, params[:search], id: 'search-field', placeholder: "Search") %>
  <%= submit_tag 'Option1' %>
  <%= submit_tag 'Option2' %>
<% end %>

您可以在每个提交按钮的当前控制器中添加代码,如下所示:

  def create
    @user = User.new(user_params)
          if params[:commit] == 'Option1'
            # code for Option1
          elsif params[:commit] == 'Option2'
            # code for Option2
          end

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

答案 1 :(得分:2)

如果您想直接回答,您可以使用以下内容:

<%= text_field_tag :search, params[:search], id: 'search-field', placeholder: "Search" %>
<% %w(posts users).each do |option| %>
   <%= button_to "Search #{option.titleize}", eval("#{option}_path"), id: "search-#{option}-btn", method: :get, params: { search: "" } %>
<% end %>

每当您更改&#34; main&#34;时,您就可以使用一些JS填写button_to个隐藏的搜索字段。搜索:

#app/assets/javascripts/application.js
$(document).on("keyup", "#search-field", function(){
   val = $(this).val();
   $("#search-posts-btn").val(val);
   $("#search-users-btn").val(val);
});

提交后,每个button_to都会产生相应的搜索值。

-

hugo提到的警报方法是将所有请求发送到单个控制器操作,根据需要处理数据。

雨果的答案非常史诗,但我会做出一点小改变:

#config/routes.rb
get "search(/:search)", to: "application#search"

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
   def search
      if params[:search]
        case params[:search][:commit]
          when "option1"
             # Search users
          when "option2"
             # Search posts
        end
      end
   end
end

这样您就可以使用Hugo提供的表单,将整个表单数据发送到/search进行处理。