2011-03-19 71 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