2010-09-18 19 views
7

que tienen un problema debido a los alcances y el ayudante form_for en los carriles 3. Las rutas - archivo es como sigue:form_for y ámbitos, carriles 3

scope "(/:tab)" do 
    resources :article 
end 

El formulario se ve algo como esto:

<%= form_for(@article) %> 
    <%= f.label :title %> 
    <%= f.text_field :title %> 
    etc. 
<%end%> 

La pestaña - atributo se almacena en parámetros [: tab], como una cadena Mi problema es que esto genera URL incorrectas en el formulario. ¿Cómo podría hacer que esto funcione? La url article_path genreated (params [: pestaña], @ article) funciona perfectamente bien

Respuesta

10

La respuesta se me ocurrió con era bastante feo, pero funciona tanto con la actualización y crear:

<%= form_for(@article, :url => (@article.new_record? ? 
    articles_path(params[:tab]) : article_path(params[:tab], @article) do |f| %> 

updat e: Una mejor solución sería la de reemplazar el default_url_options-método para algo como esto:

def default_url_options(options={}) 
    { :tab => params[:tab] } 
end 

Entonces el <% = form_for @ article do | f | %> podría ser utilizado, y todas las direcciones URL se generaron correctamente

+1

Gracias, he tenido exactamente el mismo problema y he estado buscando una solución para esto. Pensé que habría una solución más elegante. FYI, mirando a través de los carriles de ayuda, parece preferir #persisted? ¿a #new_record ?, entonces quizás la mejor práctica sería hacer esto en su lugar: '<% = form_for (@article,: url => (@ article.persisted?? article_path (params [: tab], @article) : articles_path (params [: tab]) do | f |%> ' –

+0

' default_url_options' en el controlador, puede ser privado. – whitehat101

1

Se puede especificar la ruta de forma explícita:

<%= form_for(@article, :url => article_path(@article, :tab => params[:tab]) %> 
+2

Esto parece funcionar bien en la edición - parte, pero si quiero usar el mismo formulario tanto para nuevo como para edición, falla con el siguiente error en nuevo porque el nuevo artículo no tiene identificación – iverds

9

Probar:

<%= form_for [:tab, @article] do |f| %> 
    <%= f.label :title %> 
    <%= f.text_field :title %> 
    etc. 
<%end%> 
+1

Luego busca el tab_article_path que no está definido. – iverds

+0

¿Cuáles son las rutas generadas por su archivo routes.rb? prueba "$ rake routes" en una terminal – Yannis

+0

¡¡¡Finalmente una solución adecuada para eso !!! Muchas gracias. –

0

He encontrado que esto es un problema realmente irritante y he salido de esto por el momento con el siguiente parche de mono. Genérico como este, es una pequeña puja ya que simplemente le pasas toda la bolsa de parámetros a polymorphic_url, que es lo que form_for usa debajo del capó para adivinar la ruta. Un enfoque más conciso sería fusionar solo el valor del alcance.

Mi solución:

https://gist.github.com/1848467

module ActionDispatch 
    module Routing 
    module PolymorphicRoutes 
     def polymorphic_path(record_or_hash_or_array, options = {}) 
     begin 
      polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path)) 
     rescue Exception => e 
      polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path).merge(params.reject{|k,v| ["controller", "action"].include? k.to_s})) 
     end 
     end 
    end 
    end 
end 
0

En una situación muy similar he definido el alcance de rutas, como a continuación:

scope :path => ":election_id", :as => "election" do 
    resources :questions 
end 

Ahora tengo ayudantes como election_questions_path(@election)

En los formularios que puedo usar:

form_for [@election, @question] do |f| 
    ... 
end 

En los ejemplos anteriores @election es una instancia del modelo Elección.

Después de integrar Friendly_id en esta solución, tengo algunas URL bonitas. Por ejemplo "http://mydomain.com/elections-2012/questions/my-question"

0

Mi solución de problema similar con form_for y alcances es definir nuevo método en helpers/<model_name>/<model_name>_helper.rb, por ejemplo mina es sessions_helper.rb que contiene

module Implant::SessionsHelper 
    def sessions_form_path(session) 
    session.new_record? ? sessions_path : session_path(session) 
    end 
end 

Y en mi opinión me hizo

form_for(@session, url: sessions_form_path(@session)) do |f| 

Problemática parte routes.rb

scope module: 'implant' do 
    resources :sessions 
end 

... y para conseguir logró con :tab parámetro es posible añadirlo a el método de ayuda.

Cuestiones relacionadas