Problème sur partial


#1

Bonjour,

J’ai un problème qui me perturbe, et je suis sûr que vous avez la
réponse.

Si je fais en console :

puts "hello" if block

j’ai le message suivant :

NameError: undefined local variable or method `block' for

#Object:0xb7d1c9fc
from (irb):5

si je le fais depuis un controlleur, je n’ai pas d’erreur et block vaut
nil… Est-ce une redéfinition de method_missing qui permet de ne pas
avoir d’erreur ?

J’ai fait ce test car j’ai un comportement étrange avec un partial.
Depuis deux actions différentes index et with_tags, j’appelle la vue
index dans laquelle j’ai un partial :

<%= render(:partial => 'line_member', :collection => @members ) %>

Dans un cas (rendu depuis l’action index), tout se passe bien : block
vaut nil sans avoir été définie auparavant, et dans l’autre cas j’ai
l’erreur suivante :

undefined local variable or method `block' for

#<#Class:0xb617ab18:0xb617aaf0>

Une idée ?

Merci pour vos lumières,

Julien


#2

Julien :

J’ai fait ce test car j’ai un comportement étrange avec un partial.
Depuis deux actions différentes index et with_tags, j’appelle la vue
index dans laquelle j’ai un partial :

Avant de te répondre plus en détail, 2 vérifications :

  • tu peux nous montrer le code (éventuellement épuré) des actions
    index et with_tags ?

  • utilises-tu une variable block dans le partiel _line_member.rhtml ?

    – Jean-François.

Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)


#3

Jean-François Trân wrote:

Avant de te répondre plus en détail, 2 vérifications :

  • tu peux nous montrer le code (éventuellement épuré) des actions
    index et with_tags ?

  • utilises-tu une variable block dans le partiel _line_member.rhtml ?

    – Jean-François.

Voici mes deux actions :

%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<

def with_tag
@search = :members
all_members = Member.find_tagged_with( params[ :id ] )
@nb_results = all_members.size
respond_to do |format|
format.html do
@member_pages, @members = paginate_collection all_members, :page
=> params[ :page ]
render :action => ‘index’
end
format.xml do
render :xml => all_members.to_xml
end
end
end

def index
[…]
if session[ :search_field_members ]
search_members( session[ :search_field_members ] )
@search = :members
elsif
[…]
end
end

%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<%<

Dans mon partial, j’utilise bien une variable block. Celle-ci est
passéeen paramètre via locals pour une autre variante d’utilisation du partial.

Merci Jean-François,

Julien


#4

Jean-François Trân wrote:

block est un des noms (avec blk) qu’on utilise couramment pour

J’ai le même problème avec la variable locale blocked dans mon partial…

En rajoutant dans mon partial :

<% block ||= nil
blocked ||= nil
%>

Tout fonctionne bien.
Ca reste donc un mystère pour moi.


#5

Julien :

Dans mon partial, j’utilise bien une variable block.

Alors donne-lui un autre nom.

Celle-ci est passée en paramètre via locals pour une autre
variante d’utilisation du partial.

Sans chercher à investiguer profondément, le pb vient sûrement
du fait que tu utilises une variable appelée block.
block est un des noms (avec blk) qu’on utilise couramment pour
récupérer un block attaché lors d’un appel de méthode, dans ladite
méthode, sous la forme d’un objet Proc. Si on ne passe pas de
block, la variable block vaut nil.

Exemple AV::B#render(options = {}, old_local_assigns = {}, &block)

Dans le cas précis d’AV::B, ça peut porter conflit avec le
mécanisme des local_assigns.

– Jean-François.


#6

Julien :

Tout fonctionne bien.
Ca reste donc un mystère pour moi.

Mon diagnostic à l’arrache n’est peut-être pas le bon.
Et j’ai lu rapidement un point de ton message.

Vérifie que ta variable est bien définie avec des tests
comme if defined?(blocked) ou if locals[:blocked]
dans ton partiel.

Ceci dit, j’éviterai quand même d’appeler une variable block.

-- Jean-François.