2011-12-23 33 views
7

Tôi đã trở nên hơi nhầm lẫn về ý tưởng "dựng hình" một "mẫu" do cách tác giả nói về nó trong sách tôi đang đọc .Đường ray: Ý nghĩa thực sự của việc "hiển thị mẫu" là

Sự hiểu biết ban đầu của tôi về "hiển thị mẫu" là Rails đang cung cấp nội dung được xem trên màn hình/trình bày cho người xem (theo cách mà một phần được hiển thị) nhưng cuốn sách tôi đọc dường như đang sử dụng khái niệm "dựng hình mẫu" cũng có nghĩa là một cái gì đó khác. Hãy để tôi giải thích trong ngữ cảnh

Sách này (đường ray 3 trong hành động) thiết lập bố cục trang bằng cách sử dụng tệp layouts/application.html.erb thông thường và sau đó "sản xuất" cho các trang xem khác nhau, chẳng hạn như views/tickets/show.html.erb để thêm nội dung vào màn hình. đó là tất cả đơn giản ..

Trong chế độ xem này views/tickets/show.html.erb, có hiển thị một phần (cũng là khái niệm đơn giản).

<div id='tags'><%= render @ticket.tags %></div> 

Bây giờ trong phần này có nghĩa là, sử dụng ajax, một cuộc gọi đến một phương pháp "loại bỏ" trong "tags_controller.rb" được thiết kế để cho phép người dùng có thẩm quyền để loại bỏ một "tag" từ một "vé" trong ứng dụng quản lý dự án giả lập của chúng tôi.

<% if can?(:tag, @ticket.project) || current_user.admin? %> 
    <%= link_to "x", remove_ticket_tag_path(@ticket, tag), 
     :remote => true, 
     :method => :delete, 
     :html => { :id => "delete-#{tag.name.parameterize}" } %> 
    <% end %> 

Bây giờ đây là "loại bỏ" hành động trong bộ điều khiển thẻ (mà disassociates thẻ từ vé trong cơ sở dữ liệu) ...

def remove 
    @ticket = Ticket.find(params[:ticket_id]) 
    if can?(:tag, @ticket.project) || current_user.admin? 
     @tag = Tag.find(params[:id]) 
     @ticket.tags -= [@tag] 
     @ticket.save 
    end 
    end 
end 

Vào cuối của hành động loại bỏ này, tác giả ban đầu bao gồm render :nothing => true, nhưng sau đó ông đã sửa đổi hành động vì, như ông nói, "bạn sẽ làm cho nó hiển thị mẫu." Đây là nơi tôi bị nhầm lẫn

Mẫu mà hành động này hiển thị là "remove.js.erb", chỉ có một dòng jquery bên trong, mục đích là xóa "thẻ" khỏi trang (tức là thẻ mà người dùng nhìn thấy trên màn hình) bây giờ nó đã bị hủy liên kết khỏi vé trong cơ sở dữ liệu.

$('#tag-<%= @tag.name.parameterize %>').remove(); 

Khi tôi đọc "render một mẫu" Tôi hy vọng các ứng dụng để được chèn nội dung vào trang web, nhưng các mẫu được đưa ra bởi các "loại bỏ" hành động trong bộ điều khiển chỉ gọi một hàm jquery mà loại bỏ một phần tử từ trang.

Nếu một "mẫu" được "hiển thị", tôi đang mong đợi một mẫu khác bị xóa (để tạo chỗ cho mẫu mới) hoặc tôi đang mong đợi nội dung được "hiển thị" theo cách một phần được trả lại. Bạn có thể làm rõ những gì đang thực sự xảy ra khi một "mẫu" được "trả lại" trong tình huống với jquery trong câu hỏi này? Có thực sự đặt một trang mới ở phía trước người dùng (tôi mong đợi một số loại trang vật lý được hiển thị)

+0

+1 cho câu hỏi hay bằng văn bản – bragboy

Trả lời

3

Bạn sắp hoàn tất! Việc hiển thị mẫu thực sự luôn là về việc tạo nội dung nhưng đối với mô tả nội dung rộng hơn một chút. Nó có thể là một đoạn html, ví dụ như một cuộc gọi ajax để có được các mục mới có thể tạo ra một số html mô tả các mục mới, nhưng nó không phải là.

Mẫu có thể tạo javascript như trong ví dụ thứ hai của bạn. Cá nhân tôi đang cố gắng để tránh điều này và thay vì chuyển JSON trở lại cho khách hàng và để cho phía khách hàng js thực hiện công việc cần thiết.

Loại kết xuất khác mà bạn có thể thực hiện là tạo một số JSON. API thường sẽ làm điều này, nhưng bạn cũng có thể làm điều này trên một trang bình thường. Ví dụ thay vì vẽ một số javascript để xóa thẻ x bạn có thể làm cho json

{ to_delete: "tag-123"} 

và sau đó sẽ sử dụng jQuery thành công callback của bạn sử dụng tải trọng đó để biết được yếu tố để loại bỏ từ DOM, bằng cách này trong ứng dụng của bạn. js nộp

$('a.delete_tag').live('ajax:success', function(data){ 
    var selector = '#' + data.to_delete; 
    $(selector).remove() 
} 

(Giả sử rằng các liên kết xóa của bạn có lớp 'delete_tag') Rendering JSON như thế này là không thực sự là một mẫu nào cả, vì bạn thường muốn thực hiện điều này thông qua

render :json => {:to_delete => "tag-#{@tag.name.parameterize}"} 

mặc dù tôi cho rằng bạn có thể sử dụng một mẫu erb cho điều này (tôi không thể tưởng tượng tại sao mặc dù).

+0

Điều này thật thú vị. Bạn có thể làm rõ điều gì đó không. Thay vì sử dụng mẫu, tôi đã cố gắng kết xuất: js => "$ ('# tag - <% = @ tag.name.parameterize%>'). Remove();" . Điều này làm việc, nhưng nó yêu cầu một trang làm mới để loại bỏ các thẻ, nhưng nếu tôi đặt jquery này trong một mẫu nó không yêu cầu làm mới trang để loại bỏ các thẻ. Khi bạn viết "có gọi lại thành công jQuery của bạn sử dụng tải trọng đó để biết phần tử nào cần loại bỏ khỏi DOM", điều này có cho phép tôi sử dụng render: js không có vấn đề phải làm mới trang không? Bạn có thể giải thích/hiển thị như thế nào? Cảm ơn bạn trước. – Leahcim

+0

Tôi nghi ngờ rằng nếu bạn thực hiện render js, nó sẽ có nội suy kiểu ruby ​​thông thường (# {}) hơn là xóa các thẻ –

+0

cảm ơn vì điều đó. bạn nói đúng. – Leahcim

2

Sự hiểu biết của tôi là "được hiển thị" bằng cách thực thi các hàm javascript bên trong nó. Rất thường giống như dưới đây được thực hiện:

jQuery(document).ready(function() { 
    jQuery('#element').html('<%= escape_javascript(render pages/content) %>'); 
}); 
+0

cảm ơn, vì vậy trong chức năng này, các trang/nội dung đang được đặt trong phần tử html? – Leahcim

+0

vâng, trên thực tế, bạn có thể hiển thị nội dung thường được hiển thị bởi html.erb theo cách này – prusswan

1

Có một cái nhìn tổng quan thực sự cô đọng của render tại http://guides.rubyonrails.org/layouts_and_rendering.html có thể giúp vì nó cũng đi vào các chi tiết của phương pháp ActionController::Base#render và những gì xảy ra đằng sau hậu trường khi bạn sử dụng render :nothing (ví dụ). Render nhưng cũng có thể được sử dụng cho các tệp hoặc mã nội tuyến - không chỉ là 'mẫu' theo nghĩa truyền thống.

+0

Tôi đã xem trang đó, cụ thể là 2.2.10, cung cấp hướng dẫn về cách hiển thị js trực tiếp từ hành động điều khiển như render => " cảnh báo ('Hello Rails'); " Do đó, chỉ cần thử nó, tôi đã chuyển jquery từ mẫu remove.js.erb vào trong bộ điều khiển như được mô tả trong 2.2.10, nhưng khi tôi nhấp vào phần tử, tôi cần làm mới trang để loại bỏ sẽ xảy ra . Nếu tôi có jquery trong remove.js.erb, nó thực sự loại bỏ phần tử mà không yêu cầu làm mới trang. Tương tự nhưng khác nhau. – Leahcim

+0

xem nhận xét của Frederick Cheung về lý do tại sao tôi gặp vấn đề này ... – Leahcim

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