2011-12-18 25 views
9

Điều này phải đơn giản, nhưng không thể tìm ra lý do tại sao nó gây ra lỗi thử nghiệm. Tôi đã nhận được lỗi sau khi chạy rspec. Nhưng sau khi bình luận "gửi" phương pháp, mọi thứ hoạt động tốt.Nhận sai số đối số (2 cho 0) khi chạy Kiểm tra Rspec bằng cách nhận và xóa

1) Messages GET /messages works! (now write some real specs) 
    Failure/Error: get target_app_messages_path(@message.target_app.id) 
    ArgumentError: 
     wrong number of arguments (2 for 0) 
    # ./app/controllers/messages_controller.rb:37:in `send' 

routes.rb

resources :target_apps do 
    resources :messages do 
    member do 
    post 'send' 
    end 
    end 
end 

Mẫu Mã

class Message 
    include Mongoid::Document 
    belongs_to :target_app 
end 

điều khiển Mã

class MessagesController < ApplicationController 
    def index 
    ... 
    end 
    def show 
    ... 
    end 

    ... 

    def send 
    ... 
    end 
end 

/spec/requests/message_spec.rb

describe "Messages" do 
    describe "GET /messages" do 

    let(:message) do 
    FactoryGirl.create(:message) 
    end 

    it "works! (now write some real specs)" do 
    # Run the generator again with the --webrat flag if you want to use webrat methods/matchers 
    get target_app_messages_path(message.target_app.id) 
    response.status.should be(200) 
    end 
end 

Trả lời

22

Mỗi đối tượng trong Ruby có một phương pháp gửi:

http://ruby-doc.org/core-1.9.3/Object.html

Bằng cách đặt tên hành động của bạn "gửi" bạn gây ra một cuộc xung đột tên. Hãy thử đổi tên hành động đó thành "sendmessage" hoặc xác định nó theo một cách khác. Nên có một cách để "gửi" trong bản đồ URL của bạn đến một hành động có tên là "sendmessage".

+0

Cảm ơn, David. Thay đổi hành động thành tên khác hoạt động. – CCK

+0

Một tên hành động khác cần tránh là 'xử lý'. – Mika

3

Một vài điều sai trái với điều này.

Đầu tiên is what David Grayson pointed out. Bạn không thể gọi phương thức gửi.

Thứ hai, là cách bạn đã xác định rằng hành động trong config/routes.rb của bạn, nó không phải là điều này:

resources :messages do 
    member 'send' 
end 

Như không được xác định một hành động gì cả. Trong thực tế, tôi thậm chí không chắc chắn những gì mà không. Nó phải được điều này (có tính đến tài khoản mà bạn không thể gọi nó là send cũng):

resources :messages do 
    member do 
    get 'deliver' 
    end 
end 

Để biết thêm thông tin, vui lòng xem Routing guide.

Điều thứ ba bạn đang làm sai là trong thử nghiệm của bạn, bạn cần tham chiếu hành động cho bộ điều khiển và không sử dụng tuyến đường. Điều này là do bạn đang viết một kiểm tra bộ điều khiển chức năng kiểm tra một bộ điều khiển.

Không nên này:

get target_app_messages_path(message.target_app.id) 

Nhưng thay, điều này:

get :deliver, :id => message.target_app.id 

Phương pháp này có các hành động như là đối số đầu tiên, các thông số như là đối số và phiên dữ liệu thứ hai là thứ ba tranh luận.

+0

Cảm ơn, Ryan. Tôi đã thử "get: deliver,: id => message.target_app.id". Nhưng nó đã cho tôi lỗi này "đối số xấu (đối tượng URI dự kiến ​​hoặc chuỗi URI)". Bất cứ suy nghĩ nào? Và kể từ khi tôi đang sử dụng tài nguyên lồng nhau, làm thế nào tôi có thể vượt qua id target_app để "có được" phương pháp. – CCK

+0

Tôi không thể gỡ lỗi đó mà không có một stacktrace. Bạn có thể vui lòng gist nó? –

+0

Không nên chỉ là 'get: deliver,: id => message.id' - tại sao bạn cần' target_app.id' khi thông báo đã tồn tại và có id của nó. – nmott

Các vấn đề liên quan