Rails kiểm tra xem sản lượng: khu vực được xác định trong content_for


97

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?


Xem tôi câu trả lời cho việc tạo ra một phương pháp helper để đóng gói hành vi này trong Rails 3.
tristanm

Câu trả lời:


217

@content_for_whateverkhô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 %>

16
Người trợ giúp 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.
e rằng

10

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


2
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>

2

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

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại bình luận bên dưới bài đăng của họ.
eirikir

Tôi đồng ý @eirikir, không chắc đứa trẻ 6 tuổi của tôi đang nghĩ gì. Tôi đang mở rộng & để lại câu trả lời của mình cho những người vẫn còn trên Rails 2 .. mà không có phần mở đầu không cần thiết;)
Nick

1

Đượ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

Heh tốt, tôi thích câu trả lời tự của bạn nhưng ... Điểm nhỏ, 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
Dave Nolan

1

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