2

클래스다단계 블록 방법으로 문제가 발생합니다.

class DataListBuilder 
    include ActionView::Helpers::TagHelper 
    include ActionView::Helpers::CaptureHelper 
    include ActionView::Helpers::UrlHelper 
    attr_accessor :object, :output_buffer 

    def initialize(object) 
     @object, @output_buffer = object, nil 
    end 

    def column (&block) 
     if block_given? 
     content_tag(:li, block.call(self)) 
     else 
     content_tag(:li, "") 
     end 
    end 

    def options_column(&link_block) 
     if block_given? 
     content_tag(:li, content_tag(:dl, "<dt><a href='#'>&nbsp;</a></dt><dd><ul>#{link_block.call(self)}</ul></dd>".html_safe, :class=>'options')) 
     else 
     content_tag(:li, "") 
     end 
    end 

    def link_item(title, url, options={}) 
     content_tag :li, link_to(title, url, options) 
    end 
    end 

원하는 출력은

하지만 생성 중입니다.

<li><a href="/leads/309">Show</a></li> 
<li><a href="/leads/309/edit">Edit</a></li> 
<li><a id="309" class="display-newxdoc" href="leads/309/notes/new">New Note</a></li> 
<li><a href="/leads/309/opportunities/new">Create Opportunity</a></li> 
<li><dl class="options"><dt><a href="#">&nbsp;</a></dt><dd><ul style="display: none;"> 
    <li><a data-remote="true" class="plus" href="leads/details/309">&nbsp;</a></li> 
    <li>3w</li> 
    <li>Simon Wu</li> 
    <li>1-714-553-0888</li> 
    <li>[email protected]</li> 
    <li>Unified Beat</li> 

     <li><a href="/leads/309">Show</a></li> 
     <li><a href="/leads/309/edit">Edit</a></li> 
     <li><a id="309" class="display-newxdoc" href="leads/309/notes/new">New Note</a></li> 
     <li><a href="/leads/309/opportunities/new">Create Opportunity</a></li> 
</ul></dd></dl></li> 
    </ul></dd></dl></li> 

어느 하나라도 도움이 될 수 있습니까? 그 안에.

전체 코드는 here로 표시됩니다.

답변

4

먼저 우리가 content_tag의 집중적 인 사용을 위해 도우미를 리팩토링 없다 (다만 얻을 수 이 코드에서 무슨 일이 벌어지고 있는가^_ ^).

다음으로 정의되었지만 도우미에서 전혀 사용되지 않은 output_buffer의 사용법을 추가합니다.

erb에서 호출해야하는 모든 메소드가 nil을 반환해야하므로 HTML에 나타나지 않습니다.

instance_eval의 구문 사용 도구이므로 {|c| ...} 스타일 블록이 필요하지 않습니다. DataListBuilder의 모든 변수를 직접 사용할 수 있습니다.

<%= data_list_for @leads, [" :10", "Age:30", "Contact:140", "Phone:140", "Email:180", "Company:100", ""] do |l| %> 
    <%= l.column { link_to "&nbsp;".html_safe, "leads/details/#{object.id}", :class=>:plus, :remote=>true } %> 
    <%= l.column { object.age } %> 
    <%= l.column { object.contact.complete_name } %> 
    <%= l.column { object.contact.phones.blank? ? "-" : object.contact.phones.first.phone_number } %> 
    <%= l.column { object.contact.emails.blank? ? "-" : object.contact.emails.first.email } %> 
    <%= l.column { object.company.title } %> 
    <%= l.options_column do %> 
     <%= link_item 'Show', lead_path(object.id) %> 
     <%= link_item 'Edit', edit_lead_path(object.id) %> 
     <%= link_item 'New Note', "leads/#{object.id}/notes/new", :class=>"display-newxdoc", :id=>object.id %> 
     <%= link_item 'Create Opportunity', new_lead_opportunity_path(object.id) %> 
    <% end %> 
<% end %> 
+0

정말로 정말로 감사드립니다. 그것은 작동합니다. 그것은 또한 내면과 내부에서 일어나는 일에 대한 완전한 통찰력을주었습니다. 이제 유일한 문제는'lead_path (객체)'와 라우트 메소드가 작동하지 않는다는 것입니다. 그것은'ActionView :: Template :: Error (# 에 대한 정의되지 않은 메소드'lead_path ') :'오류를 생성합니다. 이것은 목록에 남아있는 유일한 것입니다. 그것을 해결하는 데 도움주세요. –

+0

@ Nazar Huaain - 링크를 사용하여 문제를 해결하는 답변을 업데이트했습니다. 'Rails.application.routes.url_helpers'를 포함하고'controller'를'DataListBuilder'에 추가했습니다. 보기에'object.id'를 추가했습니다. http://stackoverflow.com/questions/341143/can-rails-routing-helpers-i-e-mymodel-pathmodel-be-used-in-models/5456103#5456103 자세한 정보는 –

+0

고맙습니다. 그게 내 문제를 해결해 줬어. –

0

options_column은 "차단보기"이며, 나는 = <%= l.options_column do |c| %>에서 제거 할 것입니다. 그런 다음 문자열로 직접 반환하는 대신 을 options_column에 사용합니다.

어쨌든, 간단한 솔루션 (나는 그것을 사용했습니다 아무런 문제가 전혀) 여기에 있습니다 : 모든

https://github.com/markevans/block_helpers

+0

정말 대단한 :

module DataListHelper def list_headers(args=[]) args = Array.new(args) columns = [] args.map { |o| columns << content_tag(:li, o.split(":").first, :style=>"width:#{o.split(":").second}px;") } content_tag(:ul, columns.join(" ").html_safe, :class=>"list-headers") end def data_list_total_records(array) content_tag(:div, page_entries_info(array).html_safe, :class=>"total-records") end def data_list_for(object, headers=[], &block) if object.is_a? Array if object.length == 0 list_headers(headers).concat(content_tag(:strong, "<br />No records found".html_safe)) else res_obj = data_list_total_records(object) res_obj << content_tag(:ol, :class=>"data-list") do res_ol = content_tag(:li) do res = list_headers(headers) object.each do |o| builder = DataListBuilder.new(o) res << content_tag(:li) do content_tag(:ul, :id=>o.id, :class=>"list-row #{cycle('odd', 'even')}") do capture(builder, &block) builder.output_buffer.html_safe end end end res end res_ol << data_list_pagination(object) end res_obj end else list_headers(headers).concat(content_tag(:strong, " <br />Not available.")) end end class DataListBuilder include ActionView::Helpers::TagHelper include ActionView::Helpers::CaptureHelper include ActionView::Helpers::UrlHelper include Rails.application.routes.url_helpers attr_accessor :object, :output_buffer, :controller def initialize(object) @object, @output_buffer = object, '' end def column (&block) @output_buffer << if block_given? content_tag(:li, instance_eval(&block)) else content_tag(:li, "") end nil end def options_column(&link_block) @output_buffer << if block_given? content_tag(:li) do content_tag(:dl, :class=>'options') do res = content_tag(:dt) do content_tag(:a, '&nbsp;'.html_safe, :href => '#') end res << content_tag(:dd) do content_tag(:ul) do instance_eval &link_block end end end end else content_tag(:li, "") end nil end def link_item(title, url, options={}) content_tag :li, link_to(title, url, options) end end end 

그리고보기이되었다. 하지만 나는 그것에 대해 질문이있다. 일부 컬렉션에서 반복하는 블록 도우미를 어떻게 만들 수 있습니까? 당신이 제안한 도우미의 위키에서 어떤 예나 방법을 찾을 수 없습니다. 제게 어떤 사례라도 보내주십시오. –

관련 문제