Helpers, recupero variabile

Buongiorno, ho due problemi con gli helpers.
Primo:

Ho un model Fonti secondarie (Secondaries) trattato con la STI, in cui
sono definiti 4 tipi di sottomodelli, Monography, Miscellany, Thesis,
Journal. Ora Miscellany e Journal stanno rispettivamente per miscellanea
e rivista. Devo inserire a loro volta altri due sottomodelli, Paper e
Essay che fanno parte di Journal e Miscellany. Quindi ad esempio Paper
ha i suoi attributi e in più ha un collegamento a Journal (ossia un
articolo di giornale è associato alla rivista che lo contiene. Tutto
questo per il momento funziona, non riesco però a creare quando faccio
la bibliografia una collazione dei vari attributi.
Mi spiego:

A video vorrei ottenere (in app/views/secondary/index.html.erb)

Autore, Titolo articolo in Titolo rivista.

Per risolvere questa cosa in secondary.show ho messo:

Author: <%=h @secondary.author %>

Title: <%=h @secondary.title %>

<% if @secondary.type == “Paper” %>

in: Titolo:

<%=h @j.title %>
<%=h @j.editor %>

<% end %>

Dove @j è definito così:
def show
@secondary = Secondary.find(params[:id])

   if @secondary.journal_id.present?
     @j = Journal.find(@secondary.journal_id)
   end

 respond_to do |format|
   format.html # show.html.erb
   format.xml  { render :xml => @secondary }
 end

end

Così tutto funziona, ma nell’index?
Ho impostato l’helper:

def secondary_bibliography secondary
result = []
result << " #{h secondary.author }" if secondary.author.present? and
(secondary.type == “Monography” or secondary.type == “Thesis” or
secondary.type == “Paper”)
result << “,” if secondary.author.present?
result << " #{h secondary.title }" if
secondary.title.present?
result << “in #{h j.title }” if j.title.present? and secondary.type
== “Paper”
result.join ‘’
end

che viene richiamato in app/views/index.html.erb così

<% @secondaries.each do |secondary| %>

  • <%= secondary_bibliography secondary %>

<% end %>

Devo costruire la variabile @j in def index? Come? ( ci ho provato in
mille modi ma non ne sono uscita)
oppure nell’index devo impostare un altro
<% @secondary.each do |secondary| %>

  • <%= secondary_bibliography secondary %>
<% end %> con j al posto di secondary?

Ringrazio chiunque voglia darmi una mano.
(Poi ho un altro problema, sempre con un helpers e poi ho finito il
progetto!!!)
paola

Il 19 aprile 2010 09.51, Paola A. [email protected] ha scritto:

def show
@secondary = Secondary.find(params[:id])

  if @secondary.journal_id.present?
    @j = Journal.find(@secondary.journal_id)
  end

[…]

Questo non è necessario, puoi scrivere semplicemente:
@j = @secondary.journal
O puoi non scriverlo e usare @secondary.journal invece di @j.

<% if @secondary.type == “Paper” %>

in: Titolo:

<%=h @j.title %>
<%=h @j.editor %>

<% end %>

Così tutto funziona, ma nell’index?
Appunto, visto che @j è solo @secondary.journal, usa la seconda, così
non devi definire @j in tutte le action (oppure potresti usare un
before_filter, ma non ne vedo il motivo).

Quello che non ho capito è: se @secondary.type non è “Paper”,
@secondary.journal_id è definito o è null?
Perché, se è null, potresti usare un semplice helper che renda:

in: Titolo: <%=h journal.title %> <%=h journal.editor %>

solo se journal non è nil, e quindi nella view:

Title: <%=h @secondary.title %>

<%= journal_reference @secondary.journal %>

result << “in #{h j.title }” if j.title.present? and secondary.type
== “Paper”
result.join ‘’
end

Un consiglio: non legare mai la logica al nome della classe, cioè, non
fare condizioni basate su oggetto.type == ‘NomeClasse’, perché servono
solo a complicare le cose.

Non so proporti direttamente il codice perché non ho capito
esattamente le condizioni; se me le spieghi meglio posso provarci.

La questione è: quando i dati non vanno mostrati, sono presenti? Se la
risposta è no, usa la presenza dei dati come condizione, cioè, ad
esempio:

if secondary.journal

end

In caso contrario (quando cioè, non è possibile capire cosa devi
mostrare o non mostrare se non guardando la classe dell’oggetto),
forse la cosa migliore è definire un helper per ogni classe e mostrare
l’helper giusto, tipo:

def thesis_bibliography secondary

end

def paper_bibliography secondary

end

def secondary_bibliography secondary
send “#{secondary.type.underscore}_bibliography” secondary
end

Ripeto però che questo va fatto solo se non c’è altro modo per
risolvere il problema.

pietro

Pietro G. wrote:

Il 19 aprile 2010 09.51, Paola A. [email protected] ha scritto:

def show
@secondary = Secondary.find(params[:id])

  if @secondary.journal_id.present?
    @j = Journal.find(@secondary.journal_id)
  end

[…]

Questo non � necessario, puoi scrivere semplicemente:
@j = @secondary.journal
O puoi non scriverlo e usare @secondary.journal invece di @j.

questo ha funzionato perfettamente! non ci avevo proprio pensato, avevo
cercato la soluzione più complicata!

Quello che non ho capito �: se @secondary.type non � “Paper”,
@secondary.journal_id � definito o � null?

è nullo, cioè non viene selezionato il menù a tendina che associa la
rivista all’articolo, perché non compare nel secondaries/new.

Perch�, se � null, potresti usare un semplice helper che renda:

in: Titolo: <%=h journal.title %> <%=h journal.editor %>

solo se journal non � nil, e quindi nella view:

Title: <%=h @secondary.title %>

<%= journal_reference @secondary.journal %>

� �result << “in #{h j.title }” if j.title.present? and secondary.type
== “Paper”
� �result.join ‘’
end

Un consiglio: non legare mai la logica al nome della classe, cio�, non
fare condizioni basate su oggetto.type == ‘NomeClasse’, perch� servono
solo a complicare le cose.

Non so proporti direttamente il codice perch� non ho capito
esattamente le condizioni; se me le spieghi meglio posso provarci.

La questione �: quando i dati non vanno mostrati, sono presenti? Se la
risposta � no, usa la presenza dei dati come condizione, cio�, ad
esempio:

if secondary.journal

end

In caso contrario (quando cio�, non � possibile capire cosa devi
mostrare o non mostrare se non guardando la classe dell’oggetto),
forse la cosa migliore � definire un helper per ogni classe e mostrare
l’helper giusto, tipo:

def thesis_bibliography secondary

end

def paper_bibliography secondary

end

def secondary_bibliography secondary
send “#{secondary.type.underscore}_bibliography” secondary
end

Ripeto per� che questo va fatto solo se non c’� altro modo per
risolvere il problema.

pietro

in effetti prima di arrivare alla soluzione di legare il tipo delle
classe alla logica avevo provato un approccio di questo tipo:

def secondary_bibliography secondary
case type
when secondary.type == “Monography”
result = []
result << " #{h secondary.author }" if secondary.author.present?
result << “, #{h secondary.title }” if
secondary.title.present?
result << “, ed. by #{h secondary.editor }” if
secondary.pub_place.present? and secondary.language == “en”
result << “, a cura di #{h secondary.editor }” if
secondary.pub_place.present? and secondary.language == “it”
result << “, #{h secondary.pub_place }” if
secondary.pub_place.present?
result << “, #{h secondary.publisher }” if
secondary.pub_place.present?
result << “, #{h secondary.pub_date_b }” if
secondary.pub_date_b.present?
result << “- #{h secondary.pub_date_e }” if
secondary.pub_date_e.present?
result << “, #{h secondary.volume_tot }” if
secondary.volume_tot.present?
result << “.”
result.join ‘’

 when secondary.type == "Miscellany"
   result = []
   result << "<em>#{h secondary.title }</em>" if 

secondary.title.present?
result << “, ed. by #{h secondary.editor }” if
secondary.pub_place.present? and secondary.language == “en”
result << “, a cura di #{h secondary.editor }” if
secondary.pub_place.present? and secondary.language == “it”
result << “, #{h secondary.pub_place }” if
secondary.pub_place.present?
result << “, #{h secondary.publisher }” if
secondary.pub_place.present?
result << “, #{h secondary.pub_date_b }” if
secondary.pub_date_b.present?
result << “- #{h secondary.pub_date_e }” if
secondary.pub_date_e.present?
result << “, #{h secondary.volume_tot }” if
secondary.volume_tot.present?
result << “.”
result.join ‘’

when secondary.type == "Thesis"
  result = []
  result << " #{h secondary.author }" if secondary.author.present?
  result << ", <em>#{h secondary.title }</em>" if 

secondary.title.present?
result << “, thesis subject: #{h secondary.subject }” if
secondary.subject.present?
result << “, University of #{h secondary.publisher }” if
secondary.publisher.present?
result << “, supervisor prof. #{h secondary.editor }” if
secondary.editor.present?
result << “, a.y. #{h secondary.pub_date_b }-#{h
secondary.pub_date_e }” if secondary.pub_date_b.present? and
secondary.pub_date_e.present?
result.join ‘’

when secondary.type == "Journal"
  result = []
  result << "<em>#{h secondary.title }</em>" if 

secondary.title.present?
result << “, #{h secondary.volume }” if secondary.volume.present?
result << “, #{h secondary.issue }” if secondary.issue.present?
result << " (#{h secondary.pub_date_b })" if
secondary.pub_date_b.present?
result.join ‘’

end

end

ma non mi riconosceva quel secondary.type == “type”, quindi se lo
sostituissi con un secondary.type dovrebbe funzionare?

perché io devo costruire a video la bibliografia di ogni tipo di
sottoclasse, secondo i dati di ognuna, alcuni saranno solo specifici.

perché io devo costruire a video la bibliografia di ogni tipo di
sottoclasse, secondo i dati di ognuna, alcuni saranno solo specifici.

ho sbagliato a scrivere, devo visualizzare la bibliografia di ogni tipo
di sottoclasse, secondo i dati di ognuna, ossia alcuni saranno comuni,
uno su tutti, title per esempio, altri solo specifici.

Il 19 aprile 2010 10.54, Paola A. [email protected] ha scritto:

perché io devo costruire a video la bibliografia di ogni tipo di
sottoclasse, secondo i dati di ognuna, alcuni saranno solo specifici.

ho sbagliato a scrivere, devo visualizzare la bibliografia di ogni tipo
di sottoclasse, secondo i dati di ognuna, ossia alcuni saranno comuni,
uno su tutti, title per esempio, altri solo specifici.

Beh, allora credo proprio che sia molto più semplice scrivere un
helper per ogni classe.

pietro

Pietro G. wrote:

Il 19 aprile 2010 10.54, Paola A. [email protected] ha scritto:

perch� io devo costruire a video la bibliografia di ogni tipo di
sottoclasse, secondo i dati di ognuna, alcuni saranno solo specifici.

ho sbagliato a scrivere, devo visualizzare la bibliografia di ogni tipo
di sottoclasse, secondo i dati di ognuna, ossia alcuni saranno comuni,
uno su tutti, title per esempio, altri solo specifici.

Beh, allora credo proprio che sia molto pi� semplice scrivere un
helper per ogni classe.

pietro

provo e ti dico! grazie!

2010/4/19 Paola A. [email protected]:

richiamato così nella view?
<% @secondaries.each do |secondary| %>

  • <%= secondary_bibliography secondary %>
<% end %>

Sì, dovrebbe funzionare.

pietro

quindi intendi così?

secondaries_helper.rb

module SecondariesHelper
def secondary_bibliography secondary
send “#{secondary.type.underscore}_bibliography” secondary
end

def monography_bibliography secondary
result = []
#attributi
result << “.”
result.join ‘’
end
def miscellany_bibliography secondary
result = []
#attributi
result.join ‘’
end
def thesis_bibliography secondary
result = []
#attributi
result.join ‘’
end
def journal_bibliography secondary
result = []
#attributi
result.join ‘’
end
def paper_bibliography secondary
result = []
#attributi
result.join ‘’
end

end

richiamato così nella view?
<% @secondaries.each do |secondary| %>

  • <%= secondary_bibliography secondary %>
<% end %>

ma se l’if glielo metto nella index view? tipo

<% @secondaries.each do |secondary| %>

  • <% if secondary.journal %> <%= journal_bibliography secondary %> <% end %> <% elsif secondary.paper %> <%= paper_bibliography secondary %> <% end %> <% elsif secondary.monography %> <%= monography_bibliography secondary %> <% end %>
<% end %>

e l’helper come quello scritto prima?

Pietro G. wrote:

2010/4/19 Paola A. [email protected]:

richiamato cos� nella view?
<% @secondaries.each do |secondary| %>
�


    �

  • <%= secondary_bibliography secondary %>
    �
<% end %>

S�, dovrebbe funzionare.

pietro

in questo caso invece mi esplode tutto e mi da errore

Status: 500 Internal Server Error
/Users/paolaa/Desktop/comitatus/app/helpers/secondaries_helper.rb:3:
syntax error, unexpected tIDENTIFIER, expecting kEND

ho provato a mettere un end in più ma ovviamente non funziona.

(i’m desperate!)

<% if @secondaries and @secondaries.length > 0 %>

<% @secondaries.each do |secondary| %>
<% if secondary.monography %>

  • <%= monography_bibliography secondary %>
<% end %> <% if secondary.miscellany %>
  • <%= miscellany_bibliography secondary %>
<% end %> <% if secondary.thesis %>
  • <%= thesis_bibliography secondary %>
<% end %> <% if secondary.paper %>
  • <%= paper_bibliography secondary %>
<% end %> <% end %>

e pure sostituendo a <% if secondary.paper %>
<% if secondary.type == “Paper” %> ecc ecc ma mi da errore

nel primo caso

undefined method `journal’ for #Monography:0x1034c2c10
Extracted source (around line #4):

1: <% if @secondaries and @secondaries.length > 0 %>
2:
3: <% @secondaries.each do |secondary| %>
4: <% if secondary.journal %>
5:


    6:

  • 7: <%= journal_bibliography secondary %>

    nel secondo caso
    la schermata c’è ma è vuota, non fa vedere i record (che pure ci sono)

della serie giovedì dovrei laurearmi e ancora il progetto mi da errore!!
:(((

Io le ho provate tutte, l’unica che mi funziona è la più brutta delle
soluzioni, ossia
def secondary_bibliography secondary
result = []
result << " #{h secondary.author }" if secondary.author.present?
and (secondary.type == “Monography” or secondary.type == “Thesis” or
secondary.type == “Paper”)
result << “,” if secondary.author.present?
result << " #{h secondary.title }" if
secondary.title.present?
result << “, thesis subject: #{h secondary.subject }” if
secondary.subject.present? and secondary.type == “Thesis”
result << “, University of #{h secondary.publisher }” if
secondary.publisher.present? and secondary.type == “Thesis”
result << “, supervisor prof. #{h secondary.editor }” if
secondary.editor.present? and secondary.type == “Thesis”
result << “, ed. by #{h secondary.editor }” if
secondary.pub_place.present? and secondary.language == “en”
result << “, a cura di #{h secondary.editor }” if
secondary.pub_place.present? and secondary.language == “it”
result << “, #{h secondary.pub_place }” if
secondary.pub_place.present? and (secondary.type == “Monography” or
secondary.type == “Miscellany”)
result << “, #{h secondary.publisher }” if
secondary.publisher.present? and (secondary.type == “Monography” or
secondary.type == “Miscellany”)
result << “, University of #{h secondary.publisher }” if
secondary.publisher.present? and secondary.type == “Thesis”
result << “, a.y.” if secondary.pub_date_b.present? and
secondary.pub_date_e.present? and secondary.type == “Thesis”
result << “, #{h secondary.pub_date_b }” if
secondary.pub_date_b.present? and (secondary.type == “Monography” or
secondary.type == “Miscellany” or secondary.type == “Journal”)
result << " - #{h secondary.pub_date_e }" if
secondary.pub_date_e.present? and (secondary.type == “Monography” or
secondary.type == “Miscellany” or secondary.type == “Journal”)
result << “, #{h secondary.volume_tot }” if
secondary.volume_tot.present? and (secondary.type == “Monography” or
secondary.type == “Miscellany” or secondary.type == “Journal”)
result << " in #{h secondary.journal.title }" if
secondary.journal.title.present? and secondary.type == “Paper”
result << “.”
result.join ‘’
end

fermo restando che questa riga continua a darmi errore:

 result << " in #{h secondary.journal.title }" if 

secondary.journal.title.present? and secondary.type == “Paper”

non so più cosa fare! :frowning: