Tôi là người dùng khung công tác Ruby on Rails và đang nghĩ đến việc trả lại nó bằng cách đóng góp cho mã. Tôi hiểu rằng cần có sự hiểu biết thấu đáo về khái niệm ngôn ngữ Ruby để đóng góp? Ive nhân bản dự án, nhìn vào mã, kiểm tra vé và không biết làm thế nào để bắt đầu? Từ những gì tôi thấy Rails Framework sử dụng metaprogramming rất nhiều? Vậy khía cạnh khác của Ruby tôi phải làm chủ để bắt đầu đóng góp là gì? hoặc để đóng góp là để biết các ins and outs của Ruby? Cảm ơn bạn.!Tôi cần biết gì để đóng góp cho Rails?
Trả lời
Nó đã được khá một thời gian kể từ khi tôi chạy trên mã ruby tôi không hiểu, nhưng có những phần của đường ray mà thực sự đẩy sự hiểu biết của tôi về ruby.
Điều đó đang được nói, ngay cả khi bạn đang ở mức độ trung gian với ngôn ngữ, hãy tìm hiểu cách hoạt động của đường ray có thể là cách tuyệt vời để tăng trò chơi của bạn.
Để bắt đầu từ đâu, tôi sẽ bắt đầu bằng cách viết các plugin. Hãy suy nghĩ về một plugin tuyệt vời mà bạn có thể viết mà chưa được thực hiện, hoặc một cái gì đó mà bạn nghĩ rằng bạn có thể làm tốt hơn. Bất cứ điều gì bạn muốn làm, rất có thể là bạn sẽ cần phải móc vào một số loại đường ray nội bộ để làm điều đó, mà sẽ cung cấp cho bạn một nơi tốt để bắt đầu. Một khi bạn có một chút kiến thức về một khu vực nhất định của khung công tác, hãy xem liệu có bất kỳ lỗi nào đang mở trong khu vực đó mà bạn có thể khắc phục hay không.
Hàng rào khá cao, vì đường ray là một chương trình khá lớn và phức tạp được viết bởi những người có trình độ thông thạo cao với ngôn ngữ cực kỳ linh hoạt. Nó cũng là một thách thức lớn mà có lẽ sẽ làm cho bạn một lập trình tốt hơn cuối cùng. :)
Edit: để giúp đỡ lan can
Đây là thực sự khá thú vị nếu nó là một đoạn được thiết kế để minh họa cách biến lớp học và các lớp singleton làm việc, nhưng có nhiều cách rõ ràng hơn nhiều để thực hiện được điều tương tự nếu nó là mã "thực".
Singleton Class
Trong ruby, mọi đối tượng đều có lớp gốc. Điều này là khá bình thường đối với các ngôn ngữ OO. Những gì không bình thường là ruby cũng có một khái niệm gọi là "đối tượng individuation, điều đó có nghĩa rằng các đối tượng có thể có phương pháp mà chỉ trên một trường hợp cụ thể, nhưng không phải trên lớp cha mẹ.đây là một ví dụ nhanh chóng irb
irb(main):001:0> foo = "bar"
=> "bar"
irb(main):002:0> def foo.foo_method
irb(main):003:1> "this is _only_ on the foo instance, not on all strings"
irb(main):004:1> end
=> nil
irb(main):005:0> foo.foo_method
=> "this is _only_ on the foo instance, not on all strings"
irb(main):006:0> "bar".foo_method
NoMethodError: undefined method `foo_method' for "bar":String
from (irb):6
irb(main):007:0> foo = "New string"
=> "New string"
irb(main):008:0> foo.foo_method
NoMethodError: undefined method `foo_method' for "New string":String
from (irb):8
Đầu tiên, chúng ta gán một chuỗi cho một biến, tiếp theo, chúng ta định nghĩa một phương thức trên cá thể đó, gọi phương thức này hoạt động, nhưng gọi nó trên một chuỗi mới không hoạt động. phương thức foo
Để làm cho đối tượng có thể có được sự khác biệt, cần phải có một thứ gì đó ở giữa cá thể và lớp cha.Đó là lớp đơn, và mỗi cá thể đều có duy nhất từ tất cả các obje khác ct trường hợp. Khi ruby đang tìm kiếm một phương thức, nó sẽ xem xét lớp singleton trước lớp cha.
Tin hay không, ngay cả khi bạn chưa bao giờ nghe nói về điều này trước đây, bạn có thể đã sử dụng nó. Nếu bạn muốn thêm một "phương pháp lớp" một cái gì đó, bạn thường làm điều này
class Foo
def self.bar
"i am on the class"
end
end
Foo.bar #=> "I am on the class"
Để bắt đầu từ phía trên, báo cáo kết quả class Foo
là tương đương chính xác của Foo = Class.new do
này. Điều đang xảy ra là bạn đang gán một thể hiện mới của loại Class cho Foo không đổi. (như một sang một bên, đây là những gì tôi thích về ruby. hầu hết cú pháp thực sự chỉ là đường xung quanh một số khái niệm cốt lõi)
Bên trong một định nghĩa lớp, tự đề cập đến lớp, do đó, nói rằng def self.bar
về cơ bản là nói "xác định thanh phương thức trên lớp singleton của cá thể Class được lưu trữ trong Foo liên tục ".
Nếu bạn thấy công cụ này phức tạp, đó là vì nó. Tôi không nghĩ rằng có bất cứ điều gì được khen ngợi trong ruby khác sau đó những gì xảy ra trong quá trình tra cứu phương pháp, và các lớp singleton là một phần lớn của những gì làm cho nó rất phức tạp.
Biến Lớp
Một biến lớp được bắt đầu bằng @@
, và về cơ bản là một biến có phạm vi là tất cả các trường, các đối tượng lớp, và tất cả các lớp kế thừa từ lớp.Tôi sẽ thực hiện một cách nhanh chóng để minh họa điều này trong hành động
irb(main):003:0* class Foo
irb(main):004:1> @@instance_count = 0
irb(main):005:1>
irb(main):006:1* def initialize
irb(main):007:2> @@instance_count += 1
irb(main):008:2> end
irb(main):009:1>
irb(main):010:1* def count
irb(main):011:2> @@instance_count
irb(main):012:2> end
irb(main):013:1> end
=> nil
irb(main):014:0>
irb(main):015:0* class Bar < Foo
irb(main):016:1> end
=> nil
irb(main):017:0>
irb(main):018:0* f = Foo.new
=> #<Foo:0x7fa9089c7da0>
irb(main):019:0> f.count
=> 1
irb(main):020:0>
irb(main):021:0* b = Bar.new
=> #<Bar:0x7fa9089be0e8>
irb(main):022:0> b.count
=> 2
irb(main):023:0>
irb(main):024:0* f.count
=> 2
Đầu tiên, chúng tôi xác định Foo. Foo có một biến lớp mà theo dõi có bao nhiêu trường hợp được tạo ra. Để làm điều đó, chúng ta tăng biến đó trong hàm tạo, và cuối cùng chỉ định nghĩa một getter nhanh. Bar chỉ mở rộng Foo.
Bây giờ, để xem nó hoạt động, chúng tôi tạo một foo mới và kiểm tra số đếm, đó là 1. Tiếp theo, chúng tôi tạo một thanh mới và kiểm tra số, chúng tôi hiện đang ở mức 2. Chỉ cần đảm bảo cả Foo và Bar đều có cùng số lượng, chúng tôi kiểm tra lại ví dụ foo của chúng tôi và bây giờ là 2.
Biến lớp là một tính năng rất tình huống mà bạn thường không thấy bên ngoài mã khung. Nó thường được sử dụng khi bạn muốn theo dõi tất cả các trường hợp của một lớp nhất định.
Lan can Mã
class << Object.new
@@var = 6
end
String.class_variable_get(:@@var) #=> 6
Mã của bạn đang hiển thị những hai khái niệm trong hành động. Đầu tiên, chúng ta mở lớp singleton của một đối tượng mới và đặt một biến lớp trên nó. Nếu đó là bất cứ điều gì khác thì một biến lớp, ba dòng đầu tiên đó sẽ là mã ruby vô dụng nhất trên thế giới. Nhưng vì nó là một biến lớp, có thể nhìn thấy được đối với lớp, tất cả các cá thể của lớp, tất cả các lớp kế thừa từ lớp và tất cả các cá thể của tất cả các lớp kế thừa từ lớp. Vì lớp chúng ta đang nói đến là đối tượng, điều đó có nghĩa là mọi thứ. Vì vậy, làm class_variable_get trên String cung cấp cho bạn, nhưng bạn có thể truy cập biến đó từ bất kỳ lớp hoặc cá thể nào bạn muốn.
Tôi xin lỗi
Đây là những nội dung được đánh giá rất khó giải thích rõ ràng. Những khái niệm này đã cho tôi khoảng một tuần hoặc lâu hơn của nỗ lực khá phối hợp để quấn quanh đầu tôi. Nếu bạn có bất kỳ câu hỏi nào về những gì tôi đã viết, vui lòng hỏi, nhưng đừng nản lòng nếu bạn không "nhận được nó".
Tôi đã cố gắng viết một vài plugin dựa trên Railscasts và Rails Guide và vẫn cố gắng để làm việc trên nó ... Đánh giá cao phản hồi của bạn ... và tôi chắc chắn sẽ cố gắng để làm việc theo cách của tôi ở đó! Cảm ơn! – Jai
đây là một số mã ruby tôi không hiểu .... bạn cung cấp cho nó một đi quá;): 'class << Object.new; @@ var = 6; kết thúc; String.class_variable_get (: @@ var) # => 6' :(:(:( – horseyguy
@banister: đã viết một lời giải thích khá dài vào bài viết của tôi :) –
Để làm việc trên bất kỳ khuôn khổ nào bạn cần có sự hiểu biết hợp lý về ngôn ngữ hoặc nếu bạn biết nhiều ở một khu vực nhất định nhưng thực sự liên lạc với mọi người và chỉ cần nói chuyện với họ yêu cầu những gì hiện đang làm việc và cảm thấy bạn có thể giúp nói và cung cấp cho họ ý tưởng của bạn, vv .... tôi có nghĩa là cộng đồng dev là rất tốt đẹp và thực tế là họ dành thời gian làm việc trên một cái gì đó để cung cấp cho người khác miễn phí vì vậy luôn luôn sẵn lòng giúp đỡ và thử và bao gồm và cho bạn biết nếu và làm thế nào bạn có thể giúp đỡ.
Nhưng chủ yếu, nhiều hơn một chút sau đó các ins and outs và tốt nhất nếu bạn biết rất nhiều trong một khu vực nhất định
Ý nghĩ thực sự đánh giá cao. Tôi nghĩ bạn tự trả lời câu hỏi. Nếu bạn không thể đọc và/hoặc hiểu mã Rails, thì đó là cổ chai. Thậm chí không cần nhìn vào mã, tôi sẽ đoán một cách hoang dại rằng họ sử dụng thừa kế, mixin và lập trình meta. Bạn chắc chắn nên cố gắng nghiên cứu những khía cạnh bất kể nếu bạn sẽ đóng góp cho Rails. Chúng là các khái niệm cơ bản trong các thư viện Ruby, Rails và Ruby/Rails.
RoR có nhiều địa điểm bạn có thể bắt đầu nhưng có thể không phải là những gì bạn đang xem. Nơi đầu tiên để bắt đầu có lẽ là tài liệu here. Bạn sẽ cần phải biết một tấn Ruby ở mức độ cá nhân sâu sắc để đóng góp các bản vá lỗi nghiêm trọng, nhưng bạn có thể tham gia vào các cuộc thảo luận ngay bây giờ và bạn có thể cải thiện tài liệu theo cách mà nhóm cốt lõi thực sự, thực sự, thực sự nhu cầu.
Xin lỗi, liên kết tốt hơn here
Tôi nghĩ rằng bạn đã trả lời rất nhiều câu hỏi của riêng bạn: yes, bạn cần phải hiểu Ruby để đóng góp cho một dự án Ruby.
Nếu bạn muốn tìm hiểu, bạn có thể chọn một vé và bắt đầu hack vào nó: không có gì giống như nhảy vào cuối sâu! Tuy nhiên, tôi nghĩ rằng bạn chỉ có thể bắt đầu đóng góp hiệu quả cho một dự án một khi bạn đã sử dụng nó đủ cho chính mình để hiểu:
- Những tính năng tồn tại và rất hữu ích, và làm thế nào họ làm việc
- Những tính năng đang thiếu và cần được giúp đỡ
- có gì không rõ ràng hoặc khó hiểu và cần tài liệu
Tất cả những điều trên phải xuất phát từ thực tế cần: nếu không bạn không thể nêu trường hợp của bạn giải thích tại sao một số tính năng mà bạn nghĩ ra nhu cầu được thêm vào ...
Ngoài những nhận xét tôi rời về câu hỏi ban đầu của bạn ...
Ryan Bates (của Railscasts) nổi tiếng vừa cho ra mắt 2 Screencasts nơi ông đi qua bên trong của Rails 3 router. Tôi tìm thấy nó là một cách tiếp cận mở rộng cho mắt đọc và hiểu về khung khuôn khổ &. Nếu bạn nhận được cơ hội, kiểm tra xem chúng ra:
- http://railscasts.com/episodes/231-routing-walkthrough
- http://railscasts.com/episodes/232-routing-walkthrough-part-2
Có lẽ những 'diễn viên có thể giúp bạn được thoải mái hơn trong việc xây dựng cách tiếp cận của bạn để nhận được xuống với mã khuôn khổ.
Hy vọng điều này sẽ hữu ích!
- 1. Tôi muốn đóng góp cho hạt nhân Linux
- 2. Github đóng góp biểu đồ
- 3. Tạo AuthorizeAttribute - tôi cần biết điều gì?
- 4. Tôi cần biết gì về C++ 0x?
- 5. Những đóng góp và đóng góp vô danh trong các dự án mã nguồn mở
- 6. PHP xác minh Khoản đóng góp PayPal
- 7. Làm cách nào tôi có thể đóng góp cho các dự án FOSS?
- 8. Số tiền tùy chỉnh Paypal cho nút "Đóng góp ngay"
- 9. Đóng góp vào bản phân phối Linux
- 10. Dự án Java mã nguồn mở mà tôi có thể đóng góp là gì?
- 11. Đóng góp các bản vá lỗi từ Mercurial cho Git?
- 12. Đóng góp trong ứng dụng Android
- 13. Lợi ích của việc đóng góp cho các dự án nguồn mở là gì?
- 14. Đóng góp cho các công cụ nguồn mở
- 15. Đóng góp tập lệnh thử nghiệm
- 16. Làm cách nào tôi có thể đóng góp cho cơ sở R theo những cách nhỏ?
- 17. Tôi có thể đóng góp bản vá cho github bằng cách nào?
- 18. Trên di tích mới những gì góp phần vào "Thời gian dành cho Ruby" cho một ứng dụng Heroku Rails?
- 19. Dự án mã nguồn mở Java để đóng góp
- 20. Tôi có cần biết Ruby để học Ruby on Rails không?
- 21. Làm cách nào để xác định tổng đóng góp của nhà phát triển cho SubVersion?
- 22. Sử dụng Mercurial, tôi có thể đo lường những đóng góp cá nhân bằng cách nào?
- 23. Nút đóng góp/liên kết trong ứng dụng miễn phí
- 24. Đóng góp vào Thanh trạng thái/Cắt trong Eclipse RCP
- 25. Làm cách nào để thêm "các vệt hiện tại" của các đóng góp từ github vào blog của tôi?
- 26. Github Đóng góp lịch ngày bắt đầu thời gian
- 27. Nhận Github cá nhân đóng góp tập tin
- 28. Làm cách nào để tìm ra những gì tôi cần biết?
- 29. Tôi cần biết gì về Chữ ký XML để SAML hoạt động?
- 30. tôi có cần đóng std :: fstream không?
Đừng nghe những kẻ khác, có tấn bạn có thể làm ngay bây giờ mà không biết Ruby. Bắt đầu với tài liệu và kiểm tra, làm việc theo cách của bạn lên khi bạn đạt được sự hiểu biết –
Tôi đồng ý w/@Chuck Vose "Bắt đầu với tài liệu và kiểm tra, làm việc theo cách của bạn lên khi bạn đạt được sự hiểu biết". Ngoài ra - hãy chọn một phần của khuôn khổ mà bạn quan tâm và viết một hoặc hai plugin mở rộng khả năng của nó. Điều này thực sự giúp hiểu được nội bộ của khu vực đó. Một khi bạn có hiểu biết đó, hãy xem @ vé cho khu vực đó và xem bạn có thể làm gì. May mắn nhất! – Brian