2010-06-28 56 views
0

形式我已經在我的routes.rb生成經過多個參數

map.diff 'posts/:id/diff/:from/:to', :controller => "posts", 
        :action => "diff", :conditions => { :method => :get } 

下在我看來,文件我有以下。

- form_tag(diff_path(), :method => :get) do 
    = text_field_tag(:from, "") 
    = text_field_tag(:to, "") 
    = hidden_field_tag(:id, @post.id) 
    = submit_tag("Submit") 

我想生成一個表格,提交像「http://example.com/posts/3/diff/13/18」,但它失敗。我怎樣才能製作這樣的表格?

我需要傳遞參數diff_path(),但我不知道該怎麼做。我甚至不知道這是否可能與form_tag

錯誤消息:

diff_url failed to generate from {:action=>"diff", :controller=>"posts"} - you may have ambiguous routes, or you may need to supply additional parameters for this route. content_url has the following required parameters: ["posts", :id, "diff", :from, :to] - are they all satisfied? 
+0

你會得到什麼樣的錯誤信息? – theIV 2010-06-28 00:25:16

+0

感謝您的問題。我在我的問題中添加了錯誤消息。 – 2010-06-28 00:28:12

+0

這實際上產生了什麼HTML?這可能有助於診斷問題 – 2010-06-28 00:37:52

回答

0

據我所知,你要完成不能只是一個HTML表單做什麼。原因是表單只知道如何通過GET和POST傳統提交。它不知道URL的結構。

你得到這個錯誤消息,因爲:id:from:to參數需要形成兩個你想要的,所以當你調用diff_path()它怪胎。

就個人而言,我建議你不要使用你正在計劃的URL結構 - 但是我並不完全清楚這個頁面將要顯示的內容。無論如何,如果:from:to參數是算法輸入,而不是資源標識符,我會避免這種結構。

也就是說,如果你想實現這一點,你要麼必須實現從軌道或JavaScript重定向。


Rails的方法

#some_controller.rb 
redirect_to diff_path(:from => params[:from], :to => params[:to]) 

使用Javascript(jQuery的)方法

$(function() { 
    $("form#your_form_id_here").submit(function() { 
    window.location = "posts/" + this.id + "/diff/" + this.from + "/" + this.to; 
    return false; 
    }); 
}); 
0

我不認爲會與該格式指定URL工作在形式中。 Rails嘗試創建要在呈現頁面時提交的URL,而不是在您提交表單時提交。所以當你渲染頁面的時候沒有看到這些參數。我建議創建另一條路線

map.diff_form 'posts/:id/diff', :controller => :post, :action => :diff, :conditions => {:method => :post} 

如果您需要保留當前的url格式,您可以並排使用這兩條路徑。

0

你爲什麼試圖做到這一點呢?我真的想不出爲什麼這是必要的。

你「從」和「到」變量應該可能只是正常的URL參數 - 即/職位/:ID /差異?從= X &到= Y,以便您可以使用params [:from]和params [:to]在控制器中檢索它們。

可能有辦法讓Rails以這種方式工作,但是您會有問題,因爲Rails重點不是意味着以這種方式工作。

0

我想你可以使用這樣

diff_path(@id,@from, @to) 

其中@id,@from,@至是實例變量。如果沒有,你可以指定一個散列也像

diff_path(:id=>@id,:from=>@from, :to=>@to)