2008-10-23 12 views
29

Tôi đã bắt đầu một dự án Rails gần đây và quyết định sử dụng các bộ điều khiển RESTful. Tôi đã tạo bộ điều khiển cho các thực thể chính của mình (chẳng hạn như Quốc gia) và thêm index, new, edit, create, show, updatedelete. Tôi đã thêm map.resources :country vào các tệp tuyến đường và cuộc sống của tôi tốt.Tại sao tôi cần phải làm việc chăm chỉ hơn để làm cho ứng dụng Rails của tôi phù hợp với kiến ​​trúc RESTful?

Sau khi quá trình phát triển diễn ra một chút, tôi bắt đầu gặp phải sự cố. Đôi khi tôi cần thêm hành động trong bộ điều khiển của mình. Đầu tiên là hành động search trả lại các tùy chọn cho hộp tìm kiếm tự động hoàn thành ưa thích của tôi. Sau đó, sự cần thiết phải hiển thị các nước theo hai cách khác nhau ở những nơi khác nhau trong ứng dụng (dữ liệu được hiển thị khác nhau quá, vì vậy nó không chỉ là hai lần xem) - Tôi đã thêm hành động index_full. Sau đó, tôi muốn hiển thị một quốc gia theo tên trong URL, không phải theo id vì vậy tôi đã thêm hành động show_by_name.

Bạn làm gì khi bạn cần hành động vượt tiêu chuẩn index, new, edit, create, show, update, delete trong một bộ điều khiển RESTful trong Rails? Tôi có cần phải thêm (và duy trì) các tuyến đường thủ công trong tệp routes.rb (mà là một cơn đau), chúng có đi trong bộ điều khiển khác không, tôi có trở thành không ổn định hoặc tôi thiếu cái gì cơ bản không?

Tôi đoán tôi đang yêu cầu, tôi có cần phải làm việc chăm chỉ hơn và thêm hành động vào tệp routes.rb của tôi để có đặc quyền là RESTful không? Nếu tôi không sử dụng map.resources để thêm các tiện ích REST, các tuyến đường chuẩn :controller/:action, :controller/:action/:id sẽ xử lý mọi thứ một cách tự động.

+2

Dường như có rất nhiều sự nhầm lẫn về ý nghĩa của REST do các phương thức mặc định của đường ray. REST không bị giới hạn trong các phương thức đó, và thực sự không phải là về các phương thức cụ thể đó. Tôi cũng không hiểu tại sao bạn cảm thấy bạn phải làm việc chăm chỉ hơn khi thêm các phương thức bổ sung vào bộ điều khiển. – jshen

Trả lời

8

Nếu tôi vượt quá các hành động CRUD chuẩn với các mô hình của mình, tôi thường chỉ thêm các phương thức theo yêu cầu. Tìm kiếm là một cái gì đó tôi thêm vào nhiều bộ điều khiển, nhưng không phải mọi người, vì vậy tôi thêm nó và duy trì các tuyến đường thường:

map.resources :events, :collection => { :search => :get } 

Di chuyển những hành động này để một bộ điều khiển hoàn toàn riêng biệt có thể giữ lại một số bộ điều khiển của bạn RESTful, nhưng tôi tìm việc giữ chúng trong ngữ cảnh hữu ích hơn rất nhiều.

+0

Tôi chỉ ghét phải thêm và duy trì nhiều tên hành động trong tệp tuyến đường của mình theo cách thủ công. Nếu tôi không sử dụng REST thì tôi sẽ không cần phải làm điều đó. Có cách nào sạch hơn không? Nếu không thì đây là nó. – RichH

+1

Bạn sẽ không cần xử lý các chỉnh sửa tuyến đường bằng cách nào? Chỉ cần sử dụng cú pháp ": controller => XXX,: action => YYY"? Các tuyến được đặt tên là một thực hành tốt, cho dù bạn có đang sử dụng REST hay không. – Micah

+3

Tìm kiếm, index_full, show_by_name là tất cả các hành động truy xuất được tham số hóa (tức là R trong CRUD). Không cần thêm các tuyến mới. –

5

REST không chỉ định rằng bạn không thể có lượt xem bổ sung. Không ứng dụng thế giới thực nào có thể sử dụng chỉ các hành động được cung cấp; đây là lý do tại sao bạn có thể thêm hành động của riêng bạn.

REST sắp có thể thực hiện cuộc gọi không trạng thái đến máy chủ. Hành động tìm kiếm của bạn là không trạng thái mỗi lần vì dữ liệu cho đến nay được cung cấp ngược lại, đúng không? Hành động hiển thị thay thế của bạn cũng không trạng thái, chỉ là một chế độ xem khác.

Để xem liệu chúng có phải là các tuyến đường thủ công hoặc bộ điều khiển mới hay không, điều đó phụ thuộc vào sự khác biệt của hoạt động. Chế độ xem thay thế của bạn, nếu nó cung cấp một tập hợp đầy đủ các hoạt động CRUD (tạo, đọc, cập nhật, xóa) sẽ hoạt động tốt trong bộ điều khiển mới. Nếu bạn chỉ có một chế độ xem thay thế cho dữ liệu, tôi sẽ chỉ thêm một hành động xem thay thế.

Nói cách khác, có vẻ như ứng dụng của bạn không được RESTful, vấn đề là nhận ra rằng tập hợp tính năng được tạo tự động là điểm bắt đầu chứ không phải là kết luận.

+0

Tôi đang trạng thái, vì vậy tôi đang sử dụng REST đúng cách. Tôi đoán mối quan tâm của tôi là bacause tôi đã quyết định là RESTful bây giờ tôi cần phải làm nhiều công việc hơn trong tập tin routes.rb của tôi mà tôi sẽ không cần phải làm gì nếu tôi không sử dụng REST. – RichH

+0

Vâng, mã phải đi đâu đó: Tôi tò mò nếu bạn cảm thấy rằng có hành động được xác định rõ ràng là ít hữu ích hơn có thêm dữ liệu cờ cho biết chế độ xem nào sẽ sử dụng? Trong khi lá cờ dễ dàng để mã, nó che khuất những gì hành động đang làm khá một chút. Bản chất hành động có thể khám phá là tốt. – Godeke

+0

Tôi là 100% so với ý tưởng cờ - không phải lo lắng ở đó. Vấn đề là khi tôi thêm dòng map.resources cho bộ điều khiển để thêm ánh xạ REST, hành động của tôi sẽ tự động được phát hiện khi cần phải được cấu hình thủ công trong tệp tuyến. Sau đó tôi bắt đầu có những đoạn hồi tưởng của Struts !! – RichH

13

Tôi sẽ coi search là trường hợp đặc biệt là index. Cả hai hành động đều trả về một tập hợp các tài nguyên. Thông số yêu cầu sẽ chỉ định những thứ như trang, giới hạn, thứ tự sắp xếp và truy vấn tìm kiếm.

Ví dụ:

/resources/index # normal index 
/resources/index?query=foo # search for 'foo' 

Và trong resources_controller:

before_filter :do_some_preprocessing_on_parameters 

def index 
    @resources = Resource.find_by_param(@preprocessed_params) 
end 

Đối với index_fullsearch_by_name, bạn có thể nhìn vào tách bộ điều khiển hiện tại của bạn thành hai. Có mùi về những gì bạn đã mô tả.

Có nói rằng, bạn hoàn toàn đúng là không có điểm nào trong việc buộc ứng dụng của bạn sử dụng các tuyến đường yên tĩnh khi người dùng không phân phối bất kỳ điều gì qua số /:controller/:action/:id. Để đưa ra quyết định, hãy xem tần suất bạn đang sử dụng những người trợ giúp tuyến đường tài nguyên an toàn trong biểu mẫu và liên kết. Nếu bạn không sử dụng chúng, tôi sẽ không bận tâm với nó.

+0

Cách tiếp cận bạn mô tả lúc bắt đầu phá vỡ mẫu MVC trong tâm trí của tôi. Tôi đi từ việc có một hành động làm một việc sạch sẽ với một hành động làm nhiều việc khác nhau theo một cách ẩn giấu. Điểm cuối cùng của bạn thú vị - có lẽ tôi không nên sử dụng các tuyến đường yên tĩnh? – RichH

+0

Tôi thấy nó theo cách này: tìm kiếm tìm thấy một loạt các tài nguyên và hiển thị chúng theo một thứ tự nào đó. Hành động chỉ mục thực hiện tương tự, nhưng - theo mặc định - theo cách được mã hóa cứng. Vì vậy, thực sự, chỉ mục là một trường hợp tìm kiếm đặc biệt :) –

+0

Tôi đồng ý với EmbiggensTheMind: Tôi thấy chỉ mục là một trường hợp tìm kiếm đặc biệt. – MiniQuark

-1

Để duy trì RESTful trong thiết kế của bạn, bạn cần phải suy nghĩ lại những gì bạn gọi là tài nguyên.

Trong ví dụ của bạn một hành động hiển thị cho bộ điều khiển tìm kiếm, (tài nguyên tìm kiếm) là hướng duy trì sự yên tĩnh.

Trong tôi, tôi có một bộ điều khiển bảng điều khiển (chương trình) và bộ điều khiển cho các lĩnh vực duy nhất của tại chỗ ecditors (hiển thị và cập nhật)

+0

Tôi không chắc tôi hiểu ý của bạn là gì. Bạn có thể đặc sắc hơn không? Bạn có nói rằng một số hành động (chẳng hạn như tìm kiếm) nên được xem là tài nguyên? Một cái gì đó như "map.resources: user_search"? – MiniQuark

0

Theo tôi họ có thể đã biến mất một chút ra khỏi đường ray ở đây. Điều gì đã xảy ra với DRY?

Tôi vừa trở lại Rails chưa phát triển nhiều với nó kể từ phiên bản beta và tôi vẫn đang chờ bóng đèn bật sáng ở đây. Tôi vẫn cho nó một cơ hội nhưng nếu nó không xảy ra cho tôi vào cuối dự án hiện tại của tôi, tôi có thể sẽ quay trở lại các tuyến tiêu chuẩn cũ và xác định các phương pháp như tôi thực sự cần chúng cho kế tiếp .

+0

Các tuyến tài nguyên có ít ảnh hưởng đến DRYness, đó là quy ước về cấu hình. Họ thiết lập các tuyến đường được đặt tên tiêu chuẩn cho tất cả các hành động CRUD, cho 20 ứng dụng Rails mà tôi đã làm việc luôn đạt được trên 90% tuyến đường. Tất nhiên bằng cách sử dụng mặc định: controller /: action /: id có vẻ terse, nhưng làm thế nào DRY là nó khi bạn có hàng ngàn khi hàng ngàn url_for: controller => 'foo',: action => 'bar',: id => @ foo rải rác trong suốt các mẫu của bạn thay vì foo_url (@foo)? – gtd

0

Tôi sẽ không tiếp tục giải thích thêm về REST vì tôi nghĩ rằng đã được trả lời trong câu hỏi này, tuy nhiên tôi sẽ nói một chút về tuyến đường mặc định.

Vấn đề chính của tôi với tuyến đường mặc định là nếu bạn có nhiều trang web sử dụng cùng một ứng dụng Rails, nó có thể trông khủng khiếp.

Ví dụ có thể có điều khiển mà bạn không muốn mọi người có thể nhìn thấy trên một ứng dụng:

http://example1.somesite.com/example_2/foo/bar/1 

so sánh này để

/:controller/:action/:id 

này sẽ đi đến Example_2 điều khiển/foo, thanh tác vụ và id 1

Tôi coi đây là lỗ hổng chính trong tuyến đường mặc định của Rails và đây là điều mà các tuyến RESTful (có phần mở rộng tên miền phụ) hoặc chỉ các tuyến đường được đặt tên (map.connect 'foo' ...) có thể sửa.

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