मुझे आज शाम यह बहुत ही अजीब समस्या हुई जब मैं "फ़िल्टर-पोस्ट-बाय-मल्टीपल-टैग" फीचर जैसा कुछ बना रहा था।

दृश्य टेम्पलेट में:

<%
tags = Tag.all
selected_tags ||= nil
%>

<ul>
    <% tags.each do |tag| %>
    <% logger.info("selected_tags size:"+ selected_tags.size.inspect) %>
    <li><%= link_or_span(tag, selected_tags) %></li>
    <% end %>
</ul>

टैग हेल्पर में:

module TagsHelper
  def link_or_span(tag, selected_tags)
    selected_tags.delete(tag)
    link_to tag.title, tag
  end
end

यह (लॉग में) आउटपुट करता है:

चयनित_टैग आकार:2
चयनित_टैग आकार:1
चयनित_टैग आकार:0

मैं क्या अपेक्षा करता हूं:

चयनित_टैग आकार:2
चयनित_टैग आकार:2
चयनित_टैग आकार:2

मुझे लगता है कि दृश्य टेम्पलेट में var "चयनित_टैग" लूप में हर बार अछूता होना चाहिए क्योंकि यह अलग-अलग दायरे में है, है ना?

ईएनवी:

  • रूबी 1.9.2p180 (2011-02-18 संशोधन 30909) [x86_64-linux]
  • रेल 3.1.0.rc4
2
Ding Yu 19 अगस्त 2011, 18:45
1
आप डिलीट का उपयोग क्यों कर रहे हैं? हटाएं आइटम को हटा देता है। और यह एक अलग दायरा है लेकिन यह एक ही वस्तु है।
 – 
Maurício Linhares
19 अगस्त 2011, 18:47
एक अच्छी तरह से समझाया गया प्रश्न के लिए +1 जिसमें कोड, अपेक्षा और वास्तविकता शामिल थी। काश यह और भी प्रश्न लिखे जाते।
 – 
Phrogz
19 अगस्त 2011, 19:11

2 जवाब

सबसे बढ़िया उत्तर
selected_tags.delete(tag)

इससे हटाएं

selected_tags.map {|t| tag.delete(t) }

क्योंकि मुझे लगता है कि आपका कोड बिना चयनित_टैग के सभी टैग दिखाएगा? यह सही है

0
Phrogz 19 अगस्त 2011, 19:07
ठंडा! मैंने आपकी सलाह का पालन किया और selected_tags.delete(tag) को selected_tags = selected_tags.map{|t| t if t == tag ? nil : t}.compact में बदल दिया, अब यह काम करता है! धन्यवाद!
 – 
Ding Yu
19 अगस्त 2011, 19:23
क्षमा करें, गलत कोड चिपकाया। यह selected_tags = selected_tags.map{|t| t == tag ? nil : t}.compact होना चाहिए।
 – 
Ding Yu
19 अगस्त 2011, 19:34

selected_tags ऐरे का एक उदाहरण है जिसे संदर्भ द्वारा विधि में पारित किया जाएगा, इसलिए व्यवहार सही है।

शायद आपको यही चाहिए:

module TagsHelper
  def link_or_span(tag, selected_tags)
    if selected_tags.include?(tag)
      link_to tag.title, tag
    else
      # Whatever you want to do
    end
  end
end
1
Rainux 19 अगस्त 2011, 19:19
अगर मैं 1) selected_tags को इंटीजर में बदलें; 2) selected_tags.delete(tag) को selected_tags += 1 में बदलें। यह अपेक्षा के अनुरूप चलता है - टेम्पलेट में यह संस्करण अछूता रहता है। ऐसा क्यों है?
 – 
Ding Yu
19 अगस्त 2011, 19:02
selected_tags.delete(tag) ने selected_tags ऑब्जेक्ट को ही संशोधित किया, लेकिन selected_tags += 1 का अर्थ selected_tag = selected_tag + 1 है, जो गणना परिणाम को selected_tag को निर्दिष्ट करेगा, न कि मूल ऑब्जेक्ट को संशोधित करेगा।
 – 
Rainux
19 अगस्त 2011, 19:11
ठीक है, selected_tags += 1 selected_tag = selected_tag + 1 के समान है जबकि selected_tags स्वयं पूर्णांक है?! मुझे बेवकूफ कहो, मैं पूरी तरह से खो गया हूँ।
 – 
Ding Yu
19 अगस्त 2011, 19:26