2010-01-15 13 views
11

मैं रेल रूस पर रूबी में बीडीडी विकास के लिए ककड़ी का उपयोग कर रहा हूं और मैं कुछ भ्रम में भाग रहा हूं कि पथ.आरबी रेल अनुप्रयोगों में उपयोग किए जाने वाले पथों को कैसे नियंत्रित करता है।ककड़ी और webrat - paths.rb में गतिशील यूआरएल कैसे संभालें?

को देखते हुए मेरे पास है:

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

और मैं निम्नलिखित ककड़ी सुविधा है:

Scenario: A test feature 
    Given I am on the parent page 
    When I follow "Link to Children" 
    Then I should be on the children list page 
पथ के साथ

के रूप में परिभाषित:

def path_to(page_name) 
    case page_name 
    when /the children list page/ 
     '/parents/:id/children' 
end 

समस्या मैं आ रहा है सुविधा चलाते समय निम्न त्रुटि:

Spec::Expectations::ExpectationNotMetError: expected: "/parents/:id/children", 
got: "/parents/1726/children" (using ==) 

मुझे वास्तव में परवाह नहीं है कि आईडी क्या है। इसके बजाय मुझे क्या करना चाहिए? क्या यह डिफ़ॉल्ट वेब चरणों के साथ भी संभव है? क्या मैं गलत तरीके से समस्या के बारे में सोच रहा हूं?

उत्तर

18

तरह से मैं यह करते हैं, जो सबसे अच्छा तरीका नहीं हो सकता है इस प्रकार है:

when /the children list page for "(.+)"/ 
    p = Parent.find_by_name($1) 
    parent_children_path(p) 
2

हमारे एप्लिकेशन में, हम हमेशा डेटाबेस में एक नया रिकार्ड करना चाहता था जब भी कोई उपयोगकर्ता "नया" बटन क्लिक किया । इस प्रकार, हमारे नियंत्रक की नई क्रिया स्वचालित रूप से कॉल करती है और फिर संपादन कार्रवाई पर रीडायरेक्ट करती है।

हमें परीक्षण में एक ही समस्या का सामना करना पड़ा, जब हमें आईडी के बारे में इतना परवाह नहीं था - बस यह ऐप के संपादन पृष्ठ पर पहुंचा।

यहां मैं क्या आया हूं।

(नोट: कदम परिभाषा capybara का उपयोग कर लिखा है, लेकिन यह webrat से बहुत अलग नहीं होना चाहिए)

Then /^(?:|I)should now be editing the (.*)$/ do |model| 
    id = find_by_id("#{model}_id").value 
    Then "I should be on the edit #{model} page for \"#{id}\"" 
end 

मूल आधार यह है कि आप एक रेल संपादित करें पृष्ठ पर हों, आपके द्वारा संपादित किए जा रहे मॉडल के लिए एक फॉर्म होगा। उस फ़ॉर्म में हमेशा आपके द्वारा संपादित किए जा रहे विशिष्ट रिकॉर्ड की आईडी के साथ एक छिपे हुए फ़ील्ड होते हैं।

चरण छिपे हुए क्षेत्र को पाता है, इससे आईडी निकालता है, और फिर उस मॉडल के पथ को हल करने के लिए वेब_स्टेप की तलाश करता है।

बस यह सुनिश्चित करें कि आपके पास वह मॉडल है जो आप जिस मॉडल को देख रहे हैं उसके लिए मेल खाता है।

when /the edit person page for "([^\"]*)"/ 
    edit_person_path($1) 
संबंधित मुद्दे