2010-09-18 12 views
7

ich aufgrund Bereiche ein Problem haben und die form_for Helfer in Schienen 3. Die Routen - Datei wie folgt aussieht:form_for und Bereiche, Schienen 3

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

Das Formular sieht wie folgt aus:

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

Die Registerkarte - Attribut wird in params [: tab] gespeichert, als eine Zeichenfolge Mein Problem ist, dass diese falsche URLs in der Form generieren. Wie könnte ich das zur Arbeit bringen? Die genreated url article_path (params [: Tab], @article) arbeitet völlig in Ordnung

Antwort

10

Die Antwort kam ich mit war ziemlich hässlich, aber funktioniert sowohl mit dem Update und create: e: Eine bessere Lösung wäre, um die default_url_options-Methode, um so etwas wie dies außer Kraft setzen:

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

dann das <% = form_for @article do | f | %> könnte verwendet werden, und alle URLs werden korrekt generiert

+1

Danke, ich hatte genau das gleiche Problem und habe nach einer Lösung dafür gesucht. Ich dachte irgendwie, dass es eine elegantere Lösung geben würde. FYI, durch den Schienenhelfer schauend, scheint es #übergeordnet vorzuziehen? zu #new_record ?, also wäre die beste Vorgehensweise, dies stattdessen zu tun: '<% = form_for (@article,: url => (@ article.persisted?? article_path (params [: tab], @article) : articles_path (params [: tab]) tue | f |%> ' –

+0

' default_url_options' im Controller, es kann privat sein. – whitehat101

1

Sie den Pfad explizit angeben könnte:

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

Dies scheint gut zu arbeiten auf dem Bearbeitungs - Teil, aber wenn ich das gleiche Formular für neue und bearbeiten verwenden möchte, schlägt es mit dem folgenden Fehler in neu, weil der neue Artikel keine ID hat – iverds

9

Versuchen:

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

Dann sucht es nach der tab_article_path, der nicht definiert ist. – iverds

+0

Welche Routen werden von der Datei routes.rb generiert? Versuchen Sie "$ Rake Routen" in einem Terminal – Yannis

+0

Endlich eine richtige Lösung dafür !!! Vielen Dank. –

0

Ich habe festgestellt, dass dies ein wirklich irritierendes Problem ist und habe dies jetzt mit dem folgenden Affen-Patch umgangen. Generic wie folgt, es ist ein wenig Gebot aus, da Sie einfach die gesamte Tasche von Parametern zu polymorphic_url übergeben, die Form_for unter der Haube verwendet, um die Route zu erraten. Ein kürzerer Ansatz wäre es, nur den Wert des Bereichs zusammenzufassen.

Meine Lösung:

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

In einer sehr ähnlichen Situation, die ich wie unter dem Umfang in Routen definiert:

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

Jetzt habe ich Helfer wie election_questions_path(@election)

In den Formen, die ich verwenden kann:

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

In obigen Beispielen ist @election eine Instanz des Wahlmodells.

Nach der Integration von Friendly_id in diese Lösung habe ich ein paar hübsche URLs. Zum Beispiel „http://mydomain.com/elections-2012/questions/my-question“

0

Meine Lösung ähnlicher Probleme mit form_for und Tive neue Methode ist in helpers/<model_name>/<model_name>_helper.rb zu definieren, zum Beispiel mein sessions_helper ist.rb die

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

Und meiner Ansicht nach enthält machte ich

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

Problematische routes.rb Teil

scope module: 'implant' do 
    resources :sessions 
end 

... und mit :tab param verwaltet werden Sie es hinzufügen können die Hilfsmethode