【问题标题】:RAILS3: Pass arbitrary parameters via button_to?RAILS3:通过 button_to 传递任意参数?
【发布时间】:2011-03-19 16:01:49
【问题描述】:

我正在尝试在我的第一个 Rails 应用程序(Rails 3)中做一些非常简单的事情,但我不确定我做错了什么,或者是否有更好的方法。尽管搜索了很多,但在网上或这里都找不到任何可以为我解决的问题。

在应用程序中,我有 WorkRequests 和 Articles。查看文章时,我想要一个按钮来创建 WorkRequest,并在出现新的 WorkRequest 表单时填写文章。本质上,我试图将 Article.id 传递给新的 WorkRequest。

只需添加参数即可在 link_to 中工作,但我希望它是一个按钮。虽然它作为查询参数显示在 Article 表单的 HTML 中,但它永远不会到达 WorkRequest.new 方法。 This 2010 年的文章详细解释了该问题,但该解决方案对我不起作用(请参阅页面末尾的我的评论。)

这似乎应该是一件相当容易和常见的事情(一旦我弄清楚了,我自己的应用程序中还有其他几个地方我想做同样的事情)但我一直在敲我的头对着这堵特殊的墙几天了。我是 Rails 新手——这是我的第一个应用程序——所以我希望有经验的人能提供帮助!

提前致谢。

【问题讨论】:

    标签: ruby-on-rails parameters


    【解决方案1】:

    只是绕回来完成这件事。最终我通过使用 link_to 解决了这个问题,但使用 jQuery 让它看起来像一个按钮。 @kishie,如果您说您使用 button_to 完成了这项工作,我想看看代码,但由于我喜欢 jQuery,就我而言它已经解决了(无论如何,对于这个应用程序)。

    这是 Article#show 视图中的代码。 (这个类使它看起来像一个通过 jQuery 的按钮。)

    <%= link_to "New Request", new_work_request_path(:article_id => @article.id), :class => "ui-button" %>
    

    这是 Work_Request 控制器的新方法中的代码:

    if !params[:article_id].blank?
      @work_request.article = Article.find(params[:article_id])
    end
    

    然后 Work_Request#new 视图正确呈现它。

    【讨论】:

      【解决方案2】:

      在你的 routes.rb 文件中添加这行代码。

      resources :work_requests do
        member do 
          post 'new'
        end
      end
      

      它不应该是 GET 方法,因为您通过 :module_id 向服务器发送信息。这将起作用。

      <%= button_to("Add WorkRequest", {:controller => "work_request", :action => "new", :article_id => @article.id})%>
      

      【讨论】:

      • 应该是collection 而不是member
      【解决方案3】:

      我刚刚遇到了一个类似的问题,我通过如下传递参数让它工作:

      <%= button_to("Add WorkRequest", new_work_request_path(:article_id => @article.id), :action => "new", :method => :get)%>
      

      【讨论】:

        【解决方案4】:

        在文章中#show

        &lt;%= button_to("Add WorkRequest", {:controller =&gt; "work_request", :action =&gt; "new", :article_id =&gt; @article.id})%&gt;

        在 work_requests#new

        &lt;%= f.text_field :article_id, :value =&gt; params[:article_id]%&gt;

        【讨论】:

        • 这行不通,kishie。我收到一个错误:“没有路由匹配”/work_requests/new”。好的,我知道:这是因为它使用 POST 并且需要使用 GET。可以通过添加 :method => :get 来解决这个问题,如下所示:@987654323 @但是参数被剥离了。这就是问题所在。在我原来的问题中链接的文章中进行了更详细的阐述。
        • 请注意,如果您将 button_to 更改为 link_to 它可以工作,但混合链接和按钮看起来很奇怪。我想我可以求助于菜单布局,它会使用所有链接,但我不明白为什么按钮不能传递任意参数。问题是我不确定这是否是预期的行为,在这种情况下,至少了解它的基本原理会帮助我理解它,或者它是否是一个“错误”,或者是否有更好的方法来做我我正在努力。
        • 您使用什么版本的导轨?在发布我的答案之前,我检查了它,它做得很好!
        • 我正在使用 Rails 3。我确实通过 rails 创建了 work_requests 生成脚手架 WorkRequest 等。
        【解决方案5】:

        如果您将resources:work_requests 嵌套在routes.rb 中的:articles 中,则传递您的params[:id],这将是您的article_id,并将:method =&gt; :get 添加到button_to 调用中,您应该没问题。

        # config/routes.rb
        resources :articles do
          resources :work_requests
        end
        
        # app/views/articles/show.html.erb
        <%= button_to "Add Work Request", new_article_work_request_path(params[:id]), 
            :method => :get %>
        
        # app/controllers/work_requests_controller.rb
        class WorkRequestsController < ApplicationController
        
          ...
          def new
            @work_item = WorkItem.new
            @article = Article.find(params[:article_id])
            ...
          end
        
          ...
        end
        

        【讨论】:

          猜你喜欢
          • 2011-07-20
          • 1970-01-01
          • 2021-04-24
          • 2022-01-25
          • 2014-05-22
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          相关资源
          最近更新 更多