我正在尝试在我的网络应用的索引页面上创建一个表单。现在,我有一个名为home_controller.rb
的控制器和一个名为index.html.erb
的视图。那两个人现在处理我网站的“索引”。我还试图在该页面上添加一个表单。 index.html.erb
的内容是:
<%= form_tag(query_path, :method => "get") do %>
<%= submit_tag("Go!") %>
<% end %>
但是,当我加载页面时,rails会给我这个错误:
未定义的局部变量或方法 `query_path'
以下是我认为想要发生的事情:我希望home_controller.rb
中的另一个操作称为query
(此时此控制器中的唯一操作是{{1} }})。此index
操作是您单击“开始!”时从我的表单调用的操作。我该如何实现这一目标?需要什么而不是query
?
修改
我觉得必须有一个更简单的答案,而不是修改query_path
文件。我怎么错误地想到这个路由业务?在我看来,我页面上的任何操作都应默认为现有页面的控制器。因此,如果我在我的routes.rb
页面上,该index.html.erb
页面属于我的home_controller.rb
,我的:action => 'query'
应默认在home_controller.rb
中查找该操作。 为什么这不会发生?这正是我想要发生的事情。
也许我正在考虑这种完全错误的方式,这就是我们一起攻击解决方案的原因。这就是我想要的:我希望用户单击一个按钮,这会导致应用程序查询外部API,获取一些JSON,并显示JSON的内容。在我的脑海中,这意味着该按钮转到同一个控制器中的另一个动作,该动作查询外部API,并将JSON传回显示在完全相同的页面上(所有这些都使用Ajax)。我是以错误的方式处理这个问题吗?
答案 0 :(得分:1)
看起来您需要做的是在config / routes.rb中添加路由。您可以使用rake routes
查看当前路径名称。示例路线在
# Will create query_path mapping to home.query action
match 'home/query' => 'home#query', :as => :query
修改强>
您需要明确定义它,因为rails3不默认为“[controller] / [action]'通配符映射。不建议用于RESTful控制器。如果您想再次启用此功能,可以在routes.rb中取消注释,但不建议这样做。
答案 1 :(得分:0)
首先,你可能需要一个帖子而不是get。表格如下:
<%= form_tag query_path do %>
... (your form elements here)
<%= submit_tag "Submit" %>
<% end %>
您指定的query_path是命名路由。对于你的情况,你需要在你的routes.rb中这样......
scope :path => '/home', :controller => :home do
post 'query' => :query, :as => 'query'
end
编辑:
如果这确实是一个get方法,只需添加:method =&gt; “获取”表单并将路径更改为:
scope :path => '/home', :controller => :home do
get 'query' => :query, :as => 'query'
end