发布表单

时间:2015-10-23 15:57:15

标签: ruby-on-rails ruby routes

我正在尝试在我的索引页面上设置一个表单,该表单将通过GET请求将参数myform传递到同一个索引页面。我认为这会相对简单。但是我收到了一个错误。

我使用名为RecipesController的方法生成了一个控制器index

class RecipesController < ApplicationController
  def index
    @search = params[:myform] 
    return @search
  end
end

在这个方法中,当我按下按钮并触发GET请求时,我试图找回用户输入文本框的内容。

以下是我的观点:

<h1>Recipe Finder</h1>

<%= form_tag(controller:"recipes",method:"get") do %>
<%= label_tag(:myform, "Search") %>
<%= text_field_tag(:myform) %>
<%= submit_tag("search")  %>
<% end %>

以下是我的路线:

Rails.application.routes.draw do
  root 'recipes#index'

当我访问localhost:3000时显示正常,但是当我按下按钮时,我希望控制器index方法只返回我在文本框中键入的任何文本。不幸的是,我只得到:

No route matches [POST] "/" 

我知道将根设置为recipes#index导致失败,因为最初打开页面时未设置@search变量。

我想知道我是否应该为GET请求设置单独的路由和方法,我是否应该在调用localhost:3000的情况下打开主页而不在控制器中运行任何代码?这可能吗?

1 个答案:

答案 0 :(得分:0)

问题是form_tag接受Hash作为第一个和第二个参数。如果您不使用括号,它会将所有内容解释为第一个参数的一部分,并且method: "get"未正确应用。

因此,它默认执行POST请求,没有路由。

试试这个。因为第一个参数不再是Hash,所以它应该正常工作:

<%= form_tag("/", method: "get") do %>

或者,使用您的代码,您可以尝试:

<%= form_tag({ controller: "recipes" }, { method: "get" }) do %>