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.