我的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 :(得分: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)