2009-07-16 20 views
5

tôi đã chỉ định các default_url_options trong môi trường của tôi/test.rb vớidefault_url_options Dưa chuột [: host] mọi "www.example.com" ngay cả khi quy định tại environtemnts/test.rb

config.action_mailer.default_url_options = { :host => "www.xyu.at" } 

này khá ok và trong câu chuyện dưa chuột của tôi, nơi tôi kiểm tra đăng ký của người sử dụng, liên kết với người sử dụng kích hoạt được tạo ra ngay

invitation_activation_url(1) 
=> "www.xyu.at/signup/1231hj23jh23" 

Nhưng khi tôi cố gắng làm theo các liên kết được cung cấp trong email với mã sau đây trong các tính năng/bước/user_steps. rb (sử dụng email-rspec từ http://github.com/bmabey/email-spec/tree/master):

When /^I follow the invitation link$/ do 
    When 'I follow "'+invitation_activation_url(1) + '" in the email' 
end 

Đây url được tạo ra với mặc định-host:

invitation_activation_url(1) 
=> "www.example.com/signup/1231hj23jh23" 

Ai có thể giúp tôi? Tôi không hiểu những gì tôi đang làm sai ....

Cảm ơn!

EDIT:

Có vẻ như để làm với phương pháp

current_url 

nhưng tôi không biết nó đến từ đâu ..?

EDIT:

Và tôi có môi trường phù hợp quy định tại các tính năng của tôi/support/env.rb

ENV["RAILS_ENV"] ||= "test" 

EDIT:

giải pháp tạm thời của tôi là, những gì edbond đã nói,

invitation_activation_url(1, :host => "www.xyz.at") 
    => "www.xyz.at/signup/1231hj23jh23" 

nhưng tôi không muốn đặt tên miền rõ ràng theo cách này (tôi đã chỉ định trong môi trường của tôi/tệp test.rb - theo cách đó sẽ không bị khô)

Trả lời

1

Sử dụng: tùy chọn máy chủ trong url của bạn.

invitation_activation_url(1, :host => "www.xyz.at") 
    => "www.xyz.at/signup/1231hj23jh23" 

EDIT:

Bạn có thể phân tích cơ thể email và nhận được liên kết

mail = YourMailer.deliveries.last 
    email_html = Nokogiri::HTML mail.body.to_s 
    approve_link = email_html.at_css("a")["href"] 
+1

Có, đó là giải pháp tạm thời của tôi. Nhưng tôi không muốn đặt tên miền rõ ràng theo cách này (-> trùng lặp, khi tôi đã định cấu hình môi trường/test.rb trước đó!) – Lichtamberg

+0

Như Lichtamberg nói, đây là giải pháp một lần nếu bạn cần một cuộc gọi đến một trợ giúp tuyến đường để hoạt động. Nhưng đây không phải là một giải pháp chung, và sẽ là thực hành cồng kềnh và xấu để cố gắng thực hiện nó cho một ứng dụng của bất kỳ phức tạp. – Raphael

0

Bạn nói rằng bạn đã chỉnh sửa cấu hình/môi trường/thử nghiệm. rb. Bạn có chắc chắn rằng các tính năng Dưa chuột của bạn đang thực sự thực hiện trong môi trường 'thử nghiệm' không?

Gần đây tôi đã thêm dưa chuột vào dự án mà tôi đang làm việc và có vẻ như thiết lập chính nó để sử dụng môi trường 'dưa chuột' theo mặc định.

Trong tính năng/support/env.rb trong dự án của tôi có là thế này:

ENV["RAILS_ENV"] ||= "cucumber" 

Vì vậy, nếu dự án của bạn là tương tự, sau đó bạn sẽ cần để tùy chỉnh config/môi trường/cucumber.rb là tốt.

+0

Vâng, tôi đã thay đổi đó đã đến: ENV [ "RAILS_ENV"] || = "test" – Lichtamberg

0

Tôi không khủng khiếp quen với dưa chuột, vì vậy tôi không thể nói một cách chắc chắn nơi chính xác bạn sẽ phải áp dụng bản sửa lỗi này. Nhưng vấn đề là default_url_options không được đặt ở một nơi khác mà bạn đang cố gắng tạo url của mình ...

Vì vậy, lời khuyên của tôi là tìm hiểu đầu tiên trong bối cảnh url bị lỗi đang được tạo. Trước hoặc sau nó, chỉ cần xuất self.class. Đó là lớp bạn sẽ phải vá khỉ. Ví dụ, giả sử 'ClassName' được in ra.

Khi bạn đã có, trong cấu hình của bạn/môi trường/test.rb, chỉ cần thêm accessor thuộc tính và sau đó đặt nó vào những gì bạn muốn:

class ClassName 
    cattr_accessor :default_url_options 
    # or mattr_ if it's a module 
end 

và sau đó đặt nó theo cách tương tự như ActionMailer của bạn

ClassName.default_url_options = { :host => "www.xyu.at" } 

Toàn bộ quá trình này có thể hữu ích khi bạn muốn tạo url trong mô hình hoặc ở các địa điểm bí truyền khác (sau đó bạn cũng cần bao gồm ActionController :: UrlWriter).

+0

Có thể nào - đây là lỗi webrat? – Lichtamberg

0

Một giải pháp (dựa trên thông tin here) là phải có một định nghĩa bước như

Given /^the domain "(.+?)"$/ do |domain| 
    host! domain 
end 

và sử dụng nó như

Given the domain "www.foo.com" 

trong các tính năng.

Mặc dù vậy, tôi đã gặp phải sự cố khi không chuyển hướng. Tôi đã thử áp dụng this patch nhưng không có may mắn.

tôi đã kết thúc bằng một cách giải quyết rất đơn giản trong file env.rb dưa chuột của:

# There is a bug in internal_redirect? when used with explicit (non-example.com) domains. 
# This is a simple workaround but may break if we start specing external redirects. 
# https://webrat.lighthouseapp.com/projects/10503/tickets/140-current_url-should-be-fully-qualified 
class Webrat::Session 
    alias internal_redirect? redirect? 
end 

Như đã đề cập trong các bình luận, điều này có break nhiên bằng cách chuyển hướng bên ngoài, nhưng chúng ta có ai sánh kịp.

1

Tôi biết năm của nó kể từ khi bài đăng này được đăng nhưng tôi đã gặp phải vấn đề này và mất nhiều thời gian để giải mã cho đến khi tôi nhận ra.

Bạn nên sử dụng thay vì

When /^I follow the invitation link$/ do 
    When 'I follow "'+invitation_activation_path(1) + '" in the email' 
end 

các _url tạo ra các đường dẫn URL; trong khi _path tạo đường dẫn URI. web_steps.rb sử dụng URI để xác định current_url mà nó sử dụng để làm việc trên máy chủ.

từ http://api.rubyonrails.org/classes/ActionDispatch/Routing.html

tuyến đường có thể được đặt tên bằng cách thông qua một: là tùy chọn, cho phép dễ dàng tài liệu tham khảo trong nguồn của bạn như name_of_route_url cho URL đầy đủ và name_of_route_path cho đường dẫn URI.

từ web_steps.rb

Then /^(?:|I)should be on (.+)$/ do |page_name|                                  | #  end                                           
    current_path = URI.parse(current_url).path                                   | #                                             
    if current_path.respond_to? :should                                    | #  collection do                                         
    current_path.should == path_to(page_name)                                  | #  get 'sold'                                         
    else                                            | #  end                                           
    assert_equal path_to(page_name), current_path                                 | # end                                            
    end                                            | 
end 
Các vấn đề liên quan