我有一个简单的控制器“用户”,它有一个show动作(对于每个用户)。现在,我想在主页上有一个文本框,允许按用户名搜索特定用户。
因此,在show动作中,我接受用户名参数,并使用用户对象进行响应。我已经看过form_for()但似乎我需要一个@user的实例,我不太明白,因为我只是在下一个请求时检索。我已经看过教程,但他们似乎在索引控制器操作下有它但我真的希望它指向用户#show所以它将使用资产,模板,url路径等。
所以我想要一个只用/ users /执行get请求的表单。我只是缺少一些简单的东西吗?
答案 0 :(得分:1)
如果您使用form_tag
,则不需要实例。您可以详细了解form_tag
here
示例:强>
<%= form_tag("/search", method: :get) do %>
<%= text_field_tag :user %>
<%= submit_tag "Search" %>
<% end %>
答案 1 :(得分:1)
来自@Mihail的html片段对您有所帮助,但给出的示例将要求您为搜索操作创建自定义路由。
添加路线:
GET '/search', to: 'users#show'
然后在您的用户显示操作尝试通过调用以下方式查找用户:
@user = User.find_by(id: params[:user])
请务必不要使用User.find
,因为当用户不存在时您将收到错误消息。您需要做的最后一件事是确保您的用户/显示模板能够在@user为nil时处理这种情况,或者如果@user为nil则改为呈现某种自定义user_not_found页面而不是users / show。
答案 2 :(得分:0)
您可以使用form_tag代替form_for
。此外,所有表单助手都有_tag等价物。即select_tag
代替f.select
等等。并且不要忘记无法找到用户的情况,你必须以某种方式处理它。
答案 3 :(得分:0)
我只会添加我所做的。
据我所知,我在config / routes.rb上添加了/ search的路由。
get '/search', to: 'users#search'
然后在UsersController上,我添加了一个搜索操作的重定向。
def search
@username = params[:search]
redirect_to "#{users_path}/#{@username}"
end
这将允许我重复使用用户#show(模板,网址和所有内容)下的任何内容。根据我的理解,这将返回301/302,这将导致另一个HTTP请求,所以这根本不是最佳的。在节目和搜索之间共享功能可能会更清晰。