Rails - 指向表单到控制器操作

时间:2015-04-11 15:39:46

标签: ruby-on-rails forms ruby-on-rails-4 controller routes

我有一个简单的控制器“用户”,它有一个show动作(对于每个用户)。现在,我想在主页上有一个文本框,允许按用户名搜索特定用户。

因此,在show动作中,我接受用户名参数,并使用用户对象进行响应。我已经看过form_for()但似乎我需要一个@user的实例,我不太明白,因为我只是在下一个请求时检索。我已经看过教程,但他们似乎在索引控制器操作下有它但我真的希望它指向用户#show所以它将使用资产,模板,url路径等。

所以我想要一个只用/ users /执行get请求的表单。我只是缺少一些简单的东西吗?

4 个答案:

答案 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请求,所以这根本不是最佳的。在节目和搜索之间共享功能可能会更清晰。