2010-06-28 1 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

+0

Спасибо за ваш вопрос. Я добавил сообщение об ошибке в свой вопрос. –

+0

Какой HTML это действительно генерирует? Вероятно, это было бы полезно при диагностике проблемы. –

ответ

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-адреса - например,/posts /: id/diff?from = X & to = Y, чтобы вы могли их восстановить в своем контроллере с параметрами [: from] и params [: to]

Возможно, такой способ заставить Rails работать таким образом, но вы у вас будут проблемы с этим, так как Rails категорически не означает, чтобы работать таким образом.

0

Я думаю, что вы можете использовать как этот

diff_path(@id,@from, @to) 

где @id, @from, @to являются переменными экземпляра. Если нет, вы можете указать хеш также как

diff_path(:id=>@id,:from=>@from, :to=>@to) 
Смежные вопросы