2010-09-18 12 views
7

मैं स्कोप और रेल 3. मार्गों में form_for सहायक की वजह से एक समस्या है - फ़ाइल इस तरह दिखता है:form_for और स्कोप, रेल 3

:

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

प्रपत्र कुछ इस तरह दिखता

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

टैब - विशेषता पैरामीटर [: टैब] में संग्रहीत है, एक स्ट्रिंग मेरी समस्या यह है कि इस जेनेरेट फ़ॉर्म में गलत यूआरएल है। मैं इसे काम करने के लिए कैसे प्राप्त कर सकता हूं? genreated यूआरएल article_path (पैरामीटर [: टैब], @article) पूरी तरह से ठीक काम करता है

उत्तर

10

जवाब मैं आया काफी बदसूरत था, लेकिन दोनों अपडेट और बनाने के साथ काम करता है:

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

अद्यतन ई: एक बेहतर समाधान कुछ इस तरह के default_url_options-विधि ओवरराइड करने के लिए किया जाएगा: | f

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

फिर <% = form_for @article है | %> का उपयोग किया जा सकता है, और सभी यूआरएल सही ढंग से उत्पन्न होते हैं

+1

धन्यवाद, मेरे पास एक ही समस्या है और इस के लिए एक समाधान की तलाश में है। मुझे लगता है कि एक और अधिक सुरुचिपूर्ण समाधान होगा। एफवाईआई, रेल सहायक सहायक के माध्यम से देख रहा है, ऐसा लगता है कि #pers पसंद है? #new_record करने के लिए ?, तो शायद सबसे अच्छा अभ्यास इसके बजाय ऐसा करना होगा: '<% = form_for (@article,: url => (@ article.persisted?? article_path (पैराम्स [: टैब], @article) : articles_path (पैराम्स [: टैब]) do | f |%> ' –

+0

नियंत्रक में default_url_options', यह निजी हो सकता है। – whitehat101

1

आप स्पष्ट रूप से पथ निर्दिष्ट कर सकते हैं:

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

यह संपादन - भाग पर अच्छा काम करता प्रतीत होता है, लेकिन यदि मैं नए और संपादित दोनों के लिए एक ही फॉर्म का उपयोग करना चाहता हूं, तो यह नई त्रुटि में विफल रहता है क्योंकि नए आलेख में कोई आईडी – iverds

9

प्रयास करें:

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

नहीं है tab_article_path जिसे परिभाषित नहीं किया गया है। – iverds

+0

आपके मार्ग.आरबी फ़ाइल द्वारा उत्पन्न मार्ग क्या हैं? एक टर्मिनल – Yannis

+0

में "$ रेक रेक" का प्रयास करें अंत में इसके लिए एक उचित समाधान !!! बहुत धन्यवाद। –

0

मुझे यह वास्तव में परेशान करने वाली समस्या माना गया है और अब इसके लिए निम्नलिखित बंदर पैच के साथ मिल गया है। इस तरह जेनेरिक, यह थोड़ी सी बोली है क्योंकि आप आसानी से पैरामीटर के पूरे बैग को polymorphic_url में पास कर रहे हैं, जो रूट अनुमान लगाने के लिए हुड के तहत उपयोग करता है। एक और संक्षिप्त दृष्टिकोण केवल दायरे के मूल्य को मर्ज करना होगा।

मेरे समाधान:

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

एक बहुत ही इसी तरह की स्थिति मैं नीचे की तरह मार्गों में गुंजाइश परिभाषित में:

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

अब मैं election_questions_path(@election)

तरह सहायकों है रूपों में मैं उपयोग कर सकता हूं:

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

उपरोक्त उदाहरणों में @election चुनाव मॉडल का एक उदाहरण है।

इस समाधान में Friendly_id को एकीकृत करने के बाद मुझे कुछ सुंदर यूआरएल मिल गए। उदाहरण के लिए "http://mydomain.com/elections-2012/questions/my-question"

0

मेरे form_for और के साथ इसी तरह की समस्या का समाधान scopeshelpers/<model_name>/<model_name>_helper.rb में नई विधि को परिभाषित करने के लिए, उदाहरण के लिए मेरा sessions_helper है।rb जो

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

होता है और मेरे विचार में मैं

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

समस्याग्रस्त routes.rb हिस्सा

scope module: 'implant' do 
    resources :sessions 
end 

बनाया ... और आप के लिए जोड़ सकते :tab परम के साथ प्रबंधित करने के लिए सहायक विधि।

संबंधित मुद्दे