Rails: nhầm lẫn về cú pháp để chuyển các địa phương đến các bên


99

Hiểu về "ma thuật" của Rails liên quan đến việc kết xuất các bữa tiệc (và đưa người dân địa phương vào chúng).

Tại sao điều này hoạt động:

<%= render "rabbits/form" %>

Và công việc này:

<%= render "rabbits/form", :parent => @warren, :flash => flash %>

nhưng điều này không hoạt động:

<%= render "rabbits/form", :locals => { :parent => @warren, :flash => flash } %>

Nhưng điều này không:

<%= render :partial =>"rabbits/form", :locals => { :parent => @warren, :flash => flash } %>

Ngoài ra, làm thế nào tôi có thể tra cứu những sắc thái này để tôi không cần phải làm phiền mọi người trên SO?


3
Trong một bình luận bên dưới, bạn đã nói rằng tài liệu api rails không thể tìm kiếm được. Thay vào đó, bạn nên thử trang web này: apidock.com/rails . Nó cũng có ruby ​​và rspec trên đó.
ryeguy

Câu trả lời:


152

Câu trả lời ngắn gọn là phương thức kết xuất xem xét đối số đầu tiên bạn truyền vào. Nếu bạn truyền vào một hàm băm (bao gồm :partial => 'foo', :locals => {blah blah blah}) thì nó sẽ chuyển vào tất cả các đối số của bạn dưới dạng hàm băm và phân tích cú pháp chúng cho phù hợp.

Nếu bạn chuyển vào một chuỗi làm đối số đầu tiên, nó sẽ giả định đối số đầu tiên là tên một phần của bạn và sẽ chuyển phần còn lại dưới dạng các local của bạn. Tuy nhiên, trong lần gọi tiếp theo đó, nó thực sự chỉ định :locals => your_locals_argument, trong trường hợp này là toàn bộ :locals => {locals hash}, thay vì chỉ {locals hash}; tức là bạn kết thúc với :locals => {:locals => {locals hash}}, hơn là :locals => {locals hash}.

Vì vậy, lời khuyên của tôi là luôn luôn chuyển các giá trị một cách rõ ràng theo cùng một cách, và bạn sẽ không gặp vấn đề gì. Để tìm hiểu về điều này, tôi đã đi trực tiếp vào chính mã ( actionpack / lib / base.rb , render()phương thức trong Rails 2; Rails 3 thì khác). Đó là một bài tập tốt.

Hơn nữa, không lo "làm phiền" mọi người trên SO. Đó là lý do tại sao trang web này tồn tại. Tôi thậm chí đã học được điều gì đó từ điều này.


5

nếu bạn cần chỉ định: địa phương, bạn cần chỉ định: một phần hoặc: mẫu

<%= render :partial => "rabbits/form", :locals => {...} %>

nên làm việc


nó liên quan đến cách ruby ​​đánh giá hàm băm nếu bạn tò mò theo cách đó.
sethvargo

Quả thực nó hoạt động..như tôi đã nêu rõ trong câu hỏi của mình ... nhưng điều tôi tự hỏi là tại sao? và tài liệu này được ghi ở đâu? chỉ bằng cách nhìn vào nguồn? Và, nếu đó là cách duy nhất để tìm và hiểu về những vô số sắc thái trong Rails sau đó tôi tự hỏi như thế nào & ở đâu để đi về vị trí và giải thích này từ nguồn. Tôi không thể chỉ nhấp vào "kết xuất" và sau đó đi sâu vào nguồn (không phải với TextMate) hay tôi có thể?
Meltemi

1
Ah! vì vậy bạn thực sự quan tâm :). Vâng, cách duy nhất để tìm ra những điều này là a.) Có linh cảm như bạn đã làm và b.) Xem mã nguồn. Tôi không có ý tưởng làm thế nào để đi sâu nguồn mặc dù ... xin lỗi
sethvargo

ok, tôi sẽ cắn ... làm thế nào để bạn tìm kiếm những thứ này? bạn chỉ cần đào qua của bạn clone https://github.com/rails/rails.git? đây có phải là cách tốt hơn không? Xin lỗi nhưng tôi là người mới làm quen với RoR và vẫn chưa tìm được cách tốt / dễ dàng / nhất quán để tra cứu tài liệu Rails ... như vậy là . http://api.rubyonrails.org/không dễ dàng tìm kiếm được. và nguồn từ git cũng không ... thở dài
Meltemi

Tôi không phải là một chuyên gia, nhưng tôi sử dụng Aptana studio. Nó được xây dựng trên nền tảng tương tự như eclipse (nếu bạn quen thuộc). Nó cho phép bạn "nhấp chuột" và theo dõi như bạn đã nói. Bạn cũng có thể tìm kiếm trong mã và nó đã được xây dựng tại nhà ga vv Caution - một file khá lớn của nó
sethvargo

2

Để được vinh danh, tôi chỉ biết về những trường hợp sử dụng này, bởi vì tôi đã theo dõi Rails trong vài năm qua và đọc các thông báo rằng một cách làm mới đã được thêm vào. Tôi thường tự mình mắc lỗi, nhưng thường thì nó dễ dàng sửa chữa.

Nếu bạn hỏi tôi, đó là một trong những phần của API Rails chưa được suy nghĩ thấu đáo. Nó chỉ tích lũy ngày càng nhiều đường cú pháp trong nhiều năm, mà không phản đối bất kỳ hành vi cũ nào. Phương pháp kết xuất có bệnh tiểu đường.

Để làm cho nó thậm chí còn tồi tệ hơn, kết xuất hoạt động khác nhau trong bộ điều khiển và chế độ xem. Tôi cũng xem xét nội dung của đối số đầu tiên để xem đó là tệp, mẫu, hành động hay một phần. Nếu nó bắt đầu bằng một dấu gạch chéo thì đó là một tệp hoặc một cái gì đó tương tự.

Tôi ủng hộ việc sử dụng ký hiệu ngắn hơn bất cứ khi nào có thể. Bởi vì các ký hiệu ngắn không truyền đạt ý định khá tốt. Khi đọc nó, nó thường làm những gì bạn nghĩ. Viết các phần không phải là thẳng về phía trước.


1

Đây là nguồn của phương thức kết xuất từ http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render :

def render(options = {}, locals = {}, &block)
  case options
  # Here is your last case
  when Hash
    if block_given?
      _render_partial(options.merge(:partial => options.delete(:layout)), &block)
    elsif options.key?(:partial)
      _render_partial(options)
    else
      template = _determine_template(options)
      lookup_context.freeze_formats(template.formats, true)
      _render_template(template, options[:layout], options)
    end
  when :update
    update_page(&block)
  else
    # here the first three cases
    _render_partial(:partial => options, :locals => locals)
  end
end

Hy vọng điều này giúp đỡ!


Điều này giúp ích , cảm ơn! Nhưng nó không giúp tôi tự giúp mình ... nếu bạn biết tôi muốn nói gì ...
Meltemi
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.