2012-06-12 5 views
1

Я хочу создать абстрактные компоненты для своих просмотров, которые не раскрывают, как они будут отображаться. Примером является навигационный поле с вкладками, такое как tabs from bootstrapDRY просмотреть компоненты в представлениях Rails

На мой взгляд, я хочу написать s.th. например:

= tab_section(self) do 
     - tab 'tab1' do 
     %p tab1 content 
     = link_to example_var, "#top" 
     - tab 'tab2' do 
     %p tab2 content 
     = link_to 'http://example.com', "#top" 

, который затем должен быть передан s.th.th. например:

 <ul> 
      <li>tab1</li> 
      <li>tab2</li> 
     </ul> 
     <div class='content'> 
      <div class='tab'> 
      <p>tab1 content</p> 
      <a href='#top'>this could also be an @var from the controller</a> 
      </div> 
      <div class='tab'> 
      <p>tab2 content</p> 
      <a href='#top'>http://example.com</a> 
      </div> 
     </div> 

Все мои попытки отложить перевод содержимого вкладки не удались. Я создал minimal rails app, демонстрируя три подхода, которые я взял.

Взгляните на application_helper.rb и приветствие # show view. Каков правильный способ сделать такую ​​вещь?

ответ

1

я получил некоторую поддержку и нашел следующее решение:

Наружный «компонент» должен быть передан в блок, чтобы вызвать внутреннюю функцию по:

 = tab_section2 do |section| 
     - section.tab 'tab1' do 
      %p tab1 content 
      = link_to example_var, "#top" 
     - section.tab 'tab2' do 
      %p tab2 content 
      = link_to 'http://example.com', "#top" 

Поскольку мы не должны привяжите блок к экземпляру tab_section (ранее выполняемому с помощью экземпляра instance_exec), мы можем получить блок напрямую.

 def tab_section2(&blk) 
     raise "Y U NO SUPPLY block?" unless block_given? 
     ts = TabSection2.new(self, self) 
     yield(ts) 
     render :partial => '/tab2', locals: {section: ts} 
     end 

Парциальное делает функцию вывода вкладки визуализации:

%ul 
     - section.tabs.each do |tab| 
     %li= tab.name 
    .content 
     - section.tabs.each do |tab| 
     .tab 
      = tab.render.html_safe 

который реализуется следующим образом:

class Tab2 

     attr_reader :name, :blk 
     def initialize(name, context, &blk) 
     @context = context 
     @name = name 
     @blk = blk 
     end 

     def render 
     @context.capture_haml(&@blk) 
     end 
    end 

    class TabSection2 
     attr_reader :tabs 

     def initialize(context) 
     @context = context 
     @tabs = [] 
     end 

     def tab(name, &blk) 
     raise "Y U NO SUPPLY block?" unless block_given? 
     @tabs << Tab2.new(name, @context, &blk) 
     end 
    end 
Смежные вопросы