Tôi muốn thực hiện kết xuất có điều kiện ở cấp độ bố cục dựa trên mẫu thực tế đã được xác định content_for(:an__area)
, bất kỳ ý tưởng nào về cách hoàn thành việc này?
Tôi muốn thực hiện kết xuất có điều kiện ở cấp độ bố cục dựa trên mẫu thực tế đã được xác định content_for(:an__area)
, bất kỳ ý tưởng nào về cách hoàn thành việc này?
Câu trả lời:
@content_for_whatever
không được dùng nữa. Sử dụng content_for?
thay thế, như thế này:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
content_for?
chỉ tồn tại trong Rails 3. Trong Rails 2, bạn có thể sử dụng @content_for_...
biến instance.
không thực sự cần thiết để tạo một phương thức trợ giúp:
<% if @content_for_sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>
thì tất nhiên theo quan điểm của bạn:
<% content_for :sidebar do %>
...
<% end %>
Tôi sử dụng điều này mọi lúc để chuyển đổi có điều kiện giữa bố cục một cột và hai cột
Có thể tạo một người trợ giúp:
def content_defined?(var)
content_var_name="@content_for_#{var}"
!instance_variable_get(content_var_name).nil?
end
Và sử dụng điều này trong bố cục của bạn:
<% if content_defined?(:an__area) %>
<h1>An area is defined: <%= yield :an__area %></h1>
<% end %>
Được rồi, tôi sẽ tự trả lời một cách ngượng ngùng vì chưa có ai trả lời và tôi đã tìm thấy câu trả lời :) Xác định đây là một phương thức trợ giúp trong application_helper.rb hoặc bất cứ nơi nào bạn thấy thuận tiện.
def content_defined?(symbol)
content_var_name="@content_for_" +
if symbol.kind_of? Symbol
symbol.to_s
elsif symbol.kind_of? String
symbol
else
raise "Parameter symbol must be string or symbol"
end
!instance_variable_get(content_var_name).nil?
end
instance_variable_defined?(content_var_name)
là gọn gàng hơn một chút thay vì kiểm tra xem nó có phải là con số không. Thứ hai điểm lớn hơn, biến dụ content_for bị phản đối vì vậy giải pháp của bạn không phải là tương lai chứng minh
Tôi không chắc về tác động hiệu suất của việc gọi lợi nhuận hai lần, nhưng điều này sẽ thực hiện bất kể việc triển khai nội bộ của lợi nhuận (@content_for_xyz không được dùng nữa) và không có bất kỳ mã bổ sung hoặc phương thức trợ giúp nào:
<% if yield :sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>