【问题标题】:Rails - Pointing form to controller actionRails - 将表单指向控制器操作
【发布时间】:2015-06-17 06:02:04
【问题描述】:

我有一个简单的控制器“用户”,它有一个显示操作(针对每个用户)。现在,我想在主页上有一个文本框,允许通过用户名搜索特定用户。

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

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

【问题讨论】:

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


    【解决方案1】:

    我将添加我所做的。

    按照建议,我在 config/routes.rb 上为 /search 添加了一条路由。

    get '/search', to: 'users#search'
    

    然后在 UsersController 上,我在搜索操作中添加了重定向。

      def search
        @username = params[:search]
        redirect_to "#{users_path}/#{@username}"
      end
    

    这将允许我重用我在 users#show 下的所有内容(模板、url 和所有内容)。据我了解,这将返回一个 301/302 会导致另一个 HTTP 请求,所以这根本不是最优的。只在显示和搜索之间共享功能可能会更简洁。

    【讨论】:

      【解决方案2】:

      @Mihail 的 html sn-p 可以很好地帮助您,但给出的示例将要求您为搜索操作创建自定义路由。

      添加您的路线:

      GET '/search', to: 'users#show'

      然后在您的用户显示操作中尝试通过调用来查找用户:

      @user = User.find_by(id: params[:user])

      一定不要使用User.find,因为当用户不存在时会报错。您需要做的最后一件事是确保您的 users/show 模板能够处理 @user 为 nil 时的情况,或者在 @user 为 nil 时呈现某种自定义 user_not_found 页面而不是 users/show。

      【讨论】:

      • hmm.. 这样做会将其附加到我的端点,?utf8=✓&search=username&commit=Go,是否有可能使它指向 /users/(已经存在,因为我已经显示了用户列表),如果它可以重用相同的控制器操作会更好
      【解决方案3】:

      如果您使用form_tag,则不需要实例。你可以阅读更多关于form_taghere

      示例:

      <%= form_tag("/search", method: :get) do %>
        <%= text_field_tag :user %>
        <%= submit_tag "Search" %>
      <% end %>
      

      【讨论】:

        【解决方案4】:

        您可以使用form_tag 代替form_for。此外,所有表单助手都有其 _tag 等价物。 IE。 select_tag 而不是 f.select 等等。并且不要忘记找不到用户的情况,您必须以某种方式处理它。

        【讨论】:

          猜你喜欢
          • 2012-02-12
          • 1970-01-01
          • 2016-04-07
          • 1970-01-01
          • 2015-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多