रेल खंड के साथ आंशिक रेंडर


119

मैं एक html घटक का उपयोग करने की कोशिश कर रहा हूं जो मैंने लिखा है जो पैनल स्टाइल प्रदान करता है। कुछ इस तरह:

  <div class="v-panel">
    <div class="v-panel-tr"></div>
    <h3>Some Title</h3>
    <div class="v-panel-c">
      .. content goes here
    </div>
    <div class="v-panel-b"><div class="v-panel-br"></div><div class="v-panel-bl"></div></div>
  </div>

इसलिए मुझे लगता है कि रेंडर एक ब्लॉक लेता है। मुझे लगा कि मैं ऐसा कुछ कर सकता हूं:

# /shared/_panel.html.erb
<div class="v-panel">
  <div class="v-panel-tr"></div>
  <h3><%= title %></h3>
  <div class="v-panel-c">
    <%= yield %>
  </div>
  <div class="v-panel-b"><div class="v-panel-br"></div><div class="v-panel-bl"></div></div>
</div>

और मैं कुछ ऐसा करना चाहता हूं:

#some html view
<%= render :partial => '/shared/panel', :locals =>{:title => "Some Title"} do %>
  <p>Here is some content to be rendered inside the panel</p>
<% end %>

दुर्भाग्य से यह इस त्रुटि के साथ काम नहीं करता है:

ActionView::TemplateError (/Users/bradrobertson/Repos/VeloUltralite/source/trunk/app/views/sessions/new.html.erb:1: , unexpected tRPAREN

old_output_buffer = output_buffer;;@output_buffer = '';  __in_erb_template=true ; @output_buffer.concat(( render :partial => '/shared/panel', :locals => {:title => "Welcome"} do ).to_s)
on line #1 of app/views/sessions/new.html.erb:
1: <%= render :partial => '/shared/panel', :locals => {:title => "Welcome"} do -%>
...

तो यह =स्पष्ट रूप से एक ब्लॉक के साथ पसंद नहीं करता है , लेकिन अगर मैं इसे हटा देता हूं, तो यह सिर्फ कुछ भी आउटपुट नहीं करता है।

क्या किसी को पता है कि मैं यहाँ क्या हासिल करने की कोशिश कर रहा हूँ? मैं अपनी साइट पर कई स्थानों पर इस पैनल html का फिर से उपयोग करना चाहूंगा।


1
स्वीकृत उत्तर सही है, लेकिन चूंकि रेल 5.0.0 यह बिना- layoutअर्क के संभव है , इसलिए गाइड देखें ।rubyonrails.org/…
fabi

जवाबों:


208

हालांकि उन दोनों जवाब काम के ऊपर (अच्छी तरह से उदाहरण है कि टॉनी लिंक वैसे भी) मैं समाप्त हो गया है कि ऊपर पोस्ट में सबसे रसीला जवाब (Kornelis Sietsma द्वारा टिप्पणी)

मुझे लगता render :layoutहै कि वास्तव में मैं क्या देख रहा था:

# Some View
<%= render :layout => '/shared/panel', :locals => {:title => 'some title'} do %>
  <p>Here is some content</p>
<% end %>

के साथ संयुक्त:

# /shared/_panel.html.erb
<div class="v-panel">
  <div class="v-panel-tr"></div>
  <h3><%= title -%></h3>
  <div class="v-panel-c">
    <%= yield %>
  </div>
</div>

6
रेल 3.2.2 में, मुझे लगता है कि आपको <%= %>इसके बजाय उपयोग करना होगा <% %>, जैसे<%= render :layout => '/shared/panel',
Siwei शेन 3.2

आप सही हैं, यह पोस्ट रेल संस्करण के बारे में कोई धारणा नहीं बनाती है, मुझे यकीन है कि लोग यह पता लगा सकते हैं।
ब्रैड

इस तरह एक (मेरी समस्या को हल करता है +1), लेकिन क्या यह अच्छा अभ्यास है? किसी कारण से कुछ मंदी नहीं होगी? हो सकता है कि डेटाबेस जल्द ही ट्रिगर करता है क्योंकि यह एक अन्य उपज के कारण लगता है (उस समय की जांच करने का समय नहीं है, अब सिर्फ सोच रहा हूं)
समकक्ष

1
यह जानने का कोई तरीका है कि क्या किसी सामग्री का उत्पादन किया गया है? वैकल्पिक होने के मामले में।
वडकोरक्वेस्ट

3
रेल 5.0 में एक परिवर्तन हुआ था, इसलिए यह केवल सभी लेआउट के लिए सामान्य है, न कि केवल लेआउट। आप कॉलिंग कोड की पहली पंक्ति को बदल सकते हैं:<%= render '/shared/panel', title: 'some title' do %>
Jay Mitchell

27

यहां पिछले उत्तरों के आधार पर एक विकल्प दिया गया है।

अपना आंशिक बनाएँ shared/_modal.html.erb:

<div class="ui modal form">
  <i class="close icon"></i>
  <div class="header">
    <%= heading %>
  </div>
  <div class="content">
    <%= capture(&block) %>
  </div>
  <div class="actions">
    <div class="ui negative button">Cancel</div>
    <div class="ui positive button">Ok</div>
  </div>
</div>

अपनी पद्धति को परिभाषित करें application_helper.rb:

def modal_for(heading, &block)
  render(
    partial: 'shared/modal',
    locals: { heading: heading, block: block }
  )
end

इसे किसी भी दृश्य से कॉल करें:

<%= modal_for('My Title') do |t| %>
  <p>Here is some content to be rendered inside the partial</p>
<% end %>

11

आप कैप्चर हेल्पर का उपयोग कर सकते हैं और रेंडर कॉल में इनलाइन भी कर सकते हैं:

<%= render 'my_partial',
           :locals => { :title => "Some Title" },
           :captured => capture { %>
    <p>Here is some content to be rendered inside the partial</p>
<% } %>

और साझा / पैनल में:

<h3><%= title %></h3>
<div class="my-outer-wrapper">
  <%= captured %>
</div>

जो उत्पादन करेगा:

<h3>Some Title</h3>
<div class="my-outer-wrapper">
  <p>Here is some content to be rendered inside the partial</p>
</div>

Http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelb.html देखें


1
इनलाइन पैटर्न एक आंशिक जरूरत वाले कई ब्लॉक के लिए अच्छा है।
मैहम्फ

4

स्वीकृत उत्तर के आधार पर रेल 4 का उपयोग करते हुए यह मेरे लिए अच्छा काम करता है।

हम एक पैनल को इस प्रकार प्रस्तुत कर सकते हैं:

= render_panel('Non Compliance Reports', type: 'primary') do
  %p your content goes here!

यहां छवि विवरण दर्ज करें

इसके लिए एक सहायक विधि और एक साझा दृष्टिकोण की आवश्यकता होती है:

सहायक विधि (ui_helper.rb)

def render_panel(heading, options = {}, &block)
  options.reverse_merge!(type: 'default')
  options[:panel_classes] = ["panel-#{options[:type]}"]

  render layout: '/ui/panel', locals: { heading: heading, options: options } do
    capture(&block)
  end
end

देखें (/ ui/panel.html.haml)

.panel{ class: options[:panel_classes] }
  .panel-heading= heading
  .panel-body
    = yield

यह रेल 5.x में भी काम करता है, मुझे बस बदलने की जरूरत panel.html.hamlहै_panel.html.haml
क्रिस

1

मुझे लगता है कि यह काम करेगा (सिर्फ त्वरित गंदे परीक्षण) यदि आप इसे पहले एक चर पर असाइन करते हैं और फिर इसे आउटपुट करते हैं।

<% foo = render :partial => '/shared/panel', :locals =>{:title => "Some Title"} do %>
<p>Here is some content to be rendered inside the panel</p>
<% end %>
<%= foo %>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.