生成传递多个参数的表单

时间:2010-06-28 00:19:09

标签: ruby-on-rails routing

我的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?

4 个答案:

答案 0 :(得分:0)

据我所知,只有HTML表单无法完成您要完成的任务。原因是表单只知道如何通过GET和POST传统提交。它不了解URL的结构。

您收到该错误消息,因为需要:id:from:to参数来形成您想要的两个参数,因此当您致电diff_path()时,它会吓坏。

就个人而言,我建议您不要使用您计划的URL结构 - 但是我并不完全清楚这个页面将要显示的内容。无论如何,如果:from:to参数是算法输入而不是资源标识符,我会避免这种结构。

那就是说,如果你想要实现这个,你要么必须实现rails或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;
  });
});

答案 1 :(得分:0)

我不认为通过在表单中​​指定具有该格式的url会起作用。 Rails尝试创建在呈现页面时提交的URL,而不是在提交表单时。因此,在呈现页面时不会看到这些参数。我建议创建另一条路线

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

如果您需要保留当前的网址格式,可以并排使用这两条路线。

答案 2 :(得分:0)

你为什么要首先尝试这样做?我真的想不出为什么这是必要的一个很好的理由。

你的“from”和“to”变量应该只是普通的URL参数 - 即/ posts /:id / diff?from = X& to = Y,这样你就可以在控制器中用params检索它们[ :from]和params [:to]

可能有一种方法可以让Rails以这种方式工作,但是你会遇到问题,因为Rails强调意味着以这种方式工作。

答案 3 :(得分:0)

我认为你可以像这样使用

diff_path(@id,@from, @to)

其中@ id,@ from,@ to是实例变量。如果不这样做,你可以指定一个像

一样的哈希
diff_path(:id=>@id,:from=>@from, :to=>@to)