Bạn nhầm lẫn về 'response_to' và 'response_to?'


79

Tôi đang học Rails với railstutorial.org và tôi bối rối về điều gì đó: trong chương này , tác giả yêu cầu chúng ta thực hiện một số thử nghiệm trong bảng điều khiển với respond_to?phương thức trên đối tượng Người dùng và nó hoạt động tốt. Nhưng sau này, khi chúng tôi viết thử nghiệm cho :encrypted_passwordthuộc tính, anh ấy sẽ sử dụng respond_to.

Vì tò mò, tôi đã thử respond_totrong bảng điều khiển, cho một đối tượng Người dùng và tôi gặp lỗi nói rằng phương thức không tồn tại. Than ôi, nếu tôi cố gắng viết bài kiểm tra bằng cách sử dụng respond_to?thay vì respond_to, bài kiểm tra không chạy.

Ai đó có thể giải thích cho tôi sự khác biệt, và tại sao thử nghiệm chỉ chạy với respond_to?

Câu trả lời:


171

Ruby xử lý ?!như các ký tự thực tế trong một tên phương thức. respond_torespond_to?khác nhau. ?chỉ ra rằng điều này nên trả lời đúng hoặc sai (theo quy ước; đây không phải là một yêu cầu). Đặc biệt:

respond_to?là một phương thức Ruby để phát hiện xem lớp có một phương thức cụ thể nào trên đó hay không. Ví dụ,

@user.respond_to?('eat_food')

sẽ trả về true nếu Userlớp có một eat_foodphương thức trên đó.

respond_tolà một phương thức Rails để đáp ứng các loại yêu cầu cụ thể. Ví dụ:

def index
  @people = Person.find(:all)

  respond_to do |format|
    format.html
    format.xml { render :xml => @people.to_xml }
  end
end

Tuy nhiên, trong liên kết RailsTutorial mà bạn đã cung cấp, bạn đang thấy một phương thức RSpecshould tương tác với respond_tophương thức của RSpec . Điều này sẽ không khả dụng trong bảng điều khiển của bạn, trừ khi bạn chạy rails console test.


Nhưng nếu bạn đọc ví dụ trong cuốn sách, thì response_to không được sử dụng với một loại yêu cầu, mà với một thuộc tính. Có lẽ Rails ghi đè phương thức Ruby nên nó cũng chấp nhận các thuộc tính?
agente_secreto

1
Đó là một phương pháp RSpec để kiểm tra: rspec.info/documentation ... nó sẽ không khả dụng trong bảng điều khiển trừ khi bạn đặt ENV để kiểm tra.
Tim Sullivan

3
Tôi thấy thực sự buồn khi những người tạo Ruby quyết định sử dụng cùng một tên câu lệnh "response_to" cho hai thứ khác nhau: khám phá xem một đối tượng có phương thức HOẶC phản hồi với một loại yêu cầu hay không. Oh yeah, có một? điều đó làm cho chúng khác nhau. Chà. \ o /
Junior Mayhé

4
Đây hoàn toàn không phải là người tạo ra Ruby. Đầu tiên là một phương thức Ruby. Thứ hai là một phương thức Rails trên ActionController. Thứ ba là một phương pháp thư viện RSpec. ? và! trong Ruby có ý nghĩa, vậy sự khác biệt giữa response_to và response_to? bằng sự khác biệt giữa trim và trimr.
Tim Sullivan

2
Để tránh cho người dùng trong tương lai bị nhầm lẫn, phần ?cuối của một tên phương thức trong ruby không đảm bảo rằng phương thức đó sẽ trả về một boolean. Chỉ ?là một phần của tên phương thức, giống như bất kỳ ký tự nào khác. Các phương thức dấu hỏi sẽ trả về một boolean là một quy ước đã được thiết lập tốt, nhưng nó không được tuân thủ phổ biến. (xem ví dụ: github.com/rails/rails/pull/5329 và sự hỗn loạn gây ra khi một phương thức dấu chấm hỏi không trả về bool)
Andrew

4

respond_to?là một đánh giá Boolean. Các respond_tođược sử dụng (thường) để xác định các thông tin hiển thị. Thông tin thêm tại đây . Việc respond_to?kiểm tra xem một phương thức có tồn tại hay không và trả về true nếu có và trả về false nếu không.


3

Bài kiểm tra sử dụng các trình trợ giúp thuận tiện để thân thiện hơn với người dùng.

Ruby là Ruby nên việc sử dụng cái cũ tốt respond_to?sẽ hiệu quả nếu bạn gọi nó theo cách này:

 @user.respond_to?(:encrypted_password).should be_true

Có một cái khác respond_tođược sử dụng trong bộ điều khiển nhưng vẫn không liên quan gì đến những cái bạn đã gặp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.