2010-09-24 32 views
7

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?

+1

Đừ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 –

+0

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

Trả lời

4

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ó".

+0

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

+0

đâ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

+0

@banister: đã viết một lời giải thích khá dài vào bài viết của tôi :) –

0

Để 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

1

Ý 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.

2

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

1

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 ...

0

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:

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!

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