2011-03-19 49 views
15

我想在我的第一个Rails应用程序(Rails 3)中做一些非常简单的事情,但我不确定我做错了什么,或者如果有更好的方法。无法在网上找到任何东西,或者在这里为我解决了这个问题,尽管搜索很多。RAILS3:通过button_to传递任意参数?

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

在link_to中工作只是通过添加参数,但我希望它是一个按钮。虽然它在文章形式的HTML中显示为查询参数,但它永远不会到达WorkRequest.new方法。 This文章从2010年解释了一些细节的问题,但解决方案不适合我(看我的评论在本页的末尾)。

这似乎应该是一个相当容易和常见的事情要做(一旦我知道了,在我自己的应用程序中还有其他几个地方我也想做同样的事情),但是我现在已经在这个特定的墙上撞了我的头。我是Rails新手 - 这是我的第一个应用程序 - 所以我希望有更多经验的人可以帮助!

在此先感谢。

回答

6

只是盘旋回来完成这件事。最终,我通过使用link_to解决了这个问题,但是使用jQuery使它看起来像一个按钮。 @kishie,如果你说你用button_to做了这个工作,我希望看到代码,但是就我所知,它就解决了,就我而言(对于这个应用程序而言,无论如何。)

这里是Article#show view中的代码。 (类是什么使得它看起来就像通过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#新视图渲染得当。

1

在文章#显示

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

在work_requests#新

<%= f.text_field :article_id, :value => params[:article_id]%>

+1

这不行,基什。我得到一个错误:“没有路由匹配”/ work_requests/new“。OK我知道这一点:这是因为它使用POST并需要使用GET,可以通过添加:method =>:get来修复该问题,如下所示: <%= button_to(“Add WorkRequest”,{:controller =>“work_requests”,:action =>“new”,::module_id => @ pier_module.id},:method =>:get)%> 但是这个参数被删除了,这就是问题所在,在我原来的问题链接的文章中有详细说明 – 2011-03-21 14:09:55

+1

请注意,如果您将button_to更改为link_to,但混合链接和按钮看起来很奇怪。可以诉诸菜单布局,这将使用所有链接,但我不明白为什么一个按钮不能传递任意参数。 事情是我不知道这是否是打算的行为,在这种情况下,至少学习理性因为它会帮助我理解它,或者如果它是一个'错误',或者有更好的方法来做我想做的事情。 – 2011-03-21 14:13:01

+0

你使用什么版本的导轨?发布我的答案之前,我检查了它,它做得很好! – 2011-03-21 14:44:33

3

我正好碰到了类似的问题,我得到它通过传递参数如下工作:

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

加入这行代码在你的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})%> 
+0

应该是'collection' not'member' – 2015-03-16 21:23:27

0

如果你的窝为resourcesroutes.rb:articles:work_requests,然后通过你的params[:id]这将是你的article_id并添加:method => :getbutton_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