我正在尝试在我的索引页面上设置一个表单,该表单将通过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
的情况下打开主页而不在控制器中运行任何代码?这可能吗?
答案 0 :(得分:0)
问题是form_tag
接受Hash
作为第一个和第二个参数。如果您不使用括号,它会将所有内容解释为第一个参数的一部分,并且method: "get"
未正确应用。
因此,它默认执行POST请求,没有路由。
试试这个。因为第一个参数不再是Hash
,所以它应该正常工作:
<%= form_tag("/", method: "get") do %>
或者,使用您的代码,您可以尝试:
<%= form_tag({ controller: "recipes" }, { method: "get" }) do %>