【问题标题】:In Rails how do I change the params of a controller method using a search form tag?在 Rails 中,如何使用搜索表单标签更改控制器方法的参数?
【发布时间】:2019-01-22 23:33:28
【问题描述】:

我正在构建一个与外部搜索 API 交互的 Rails 应用。我有一个具有搜索功能的类方法,可以通过我的设计控制器中的索引方法访问。我怎样才能使我的表单搜索更改我的控制器方法的参数并因此执行搜索?我的代码如下。非常感谢您的帮助:)

类方法:

class Api
  include HTTParty
  base_uri "http://search.exampleapi.com"

  attr_accessor :name

  # Find a particular design, based on its name
  def find(name)
    self.class.get("/designs", query: { q: name }).parsed_response
  end
end 

控制器:

class DesignsController < ApplicationController
    def index
        @search = Api.new.find(params[:q])['results']
    end
end

Routes.rb

Rails.application.routes.draw do
    root 'designs#index'
    resources :designs
end

查看:

<h1>Search</h1>

<%= form_tag(controller: "designs", action: "search", method: "get") do %>
  <%= label_tag(:q, "Search for:") %>
  <%= text_field_tag(:q) %>
  <%= submit_tag("Search") %>
<% end %>

<h2>Search results:</h2>

<% @search.each do |design| %>  
<h3><%= design['name'] %></h3>
<h5><%= design['thumbnail_url'] %></h5>
<% end %>

【问题讨论】:

  • 你应该把action: "search"改成action: "index"
  • 谢谢 :) 我在尝试搜索时收到了 No route matches [POST] "/"
  • 我要指出一些与问题半无关的事情——在 Rails 领域,我们将控制器方法称为“动作”而不是方法。至少是通过一些 HTTP 请求访问的那些,如索引、显示、创建等。这似乎是 kasperite 指出的问题的根源。私有方法仍将被称为方法。此外,您不太可能需要在 Rails 应用程序中使用 include HTTParty - 它应该已经为您完成了。

标签: ruby-on-rails ruby httparty


【解决方案1】:

由于您可以使用索引页面,designs_path 会自动将您路由到索引控制器

<%= form_tag(designs_path, method: :get) do %>
  <%= label_tag(:q, "Search for:") %>
  <%= text_field_tag(:q) %>
  <%= submit_tag("Search") %>
<% end %>

【讨论】:

    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多