Bonjour,
Je suis en train de développer mon premier site avec Ruby on Rails
(http://cvouslechef.always.data.net) et après avoir bien avancé, je me
rend compte que j’ai peut être fait une erreur de conception.
En effet je n’ai qu’une page avec un certain nombre de div que je fais
apparaitre en fonction des circonstances au travers des fonctions Ajax/
javscript (style link_to_remote). Le problème dont je ne me rends
compte que maintenant c’est que je ne sais pas vraiment gérer des
“permaliens”, c’est à dire un lien direct vers une recette pour qu’un
utilisateur puisse éventuellement la bookmarquer ou l’envoyer par e-
mail.
Avez vous une solution à ce problème ou dois je revoir la cinématique
de mon site?
Merci
Nicolas
Hello Nicolas,
Je te suggère effectivement de revoir la cinématique en travaillant
sans javascript pour commencer (le site ne fonctionne pas sans
javascript actuellement), avec un layout simple.
Le mode actuel a plusieurs inconvénients. Côté utilisateur
effectivement, impossible de bookmarker ou d’envoyer à un ami.
Côtémoteurs de recherche, le contenu n’étant pas accessible sans
javascript, tes pages de recettes ne seront pas indexées (et c’est
dommage car leur contenu est intéressant) - au final c’est
l’internaute qui sera perdant.
voilà, au travail maintenant ! (et mes encouragements, le contenu est
sympa).
a+
Thibaut Barrère / LoGeek
http://blog.logeek.fr - about writing software
http://evolvingworker.com - tools for a better day
Bonjour à tous
Extrait de code :
20: <% form_for :truc, @truc, :url => { :action => “search” } do |f| %>
21:
22: Name
23: <%= f.text_field :name, :value => params[:truc][:name] %>
24:
25: …
Question :
Ce formulaire de recherche est présent à toutes les pages, quand le
user lance une recherche, je voudrais qu’il soit pré-rempli avec les
valeurs qu’il a envoyé. C’est pour ça que je met dans les champs, les
valeurs de params. Mais quand il navigue sans envoyer de recherche,
params est nil, donc une erreur.
A part faire un grand if/end, je vois pas comment faire pour mettre
les valeurs dans les champs si elles sont présentes. Je cale souvent
sur ce genre de truc en ruby, et je m’en sort toujours avec des
cochoneries à la PHP. A la mode de Rails, vous feriez ça comment ?
Merci
Christophe
Merci,
Mais c’est un dilemne car d’un côté, j’aime bien les animations avec
le javascript et de l’autre je pense que la possibilité de permalien
va manquer à mes utilisateurs.
Concernant le référencement, effectivement j’avais déjà identifié le
problème et à chaque affichage de la page d’accueil je met tout le
texte d’une recette choisie aléatoirement donc normalement, pour
google, il voit une page différente (si j’ai bien tout compris ;))
PS : comment ça se fait que je vois un atrue sujet à la suite du
mien :Sujet remplacé par “:value => params[:truc][:name]” par
Christophe Guégan
2008/2/11 Christophe Guégan [email protected]:
25: …
les valeurs dans les champs si elles sont présentes. Je cale souvent
sur ce genre de truc en ruby, et je m’en sort toujours avec des
cochoneries à la PHP. A la mode de Rails, vous feriez ça comment ?
Merci
Christophe
la solution qui me semble la plus adaptée a ton problème est
d’utiliser une variable initialisée dans un before filter.
Ensuite une ternaire peut t’aider pour éviter le if/else d’une ligne.
Ton code logique reste dans les controlleurs et tu appelle simplement
ta variable dans tes vues.
–
Fabien J.
Fabien J. a écrit :
24:
la solution qui me semble la plus adaptée a ton problème est
d’utiliser une variable initialisée dans un before filter.
Ensuite une ternaire peut t’aider pour éviter le if/else d’une ligne.
Je n’aurais pas utilisé ça. Pour info (je connais pas le niveau du
poseur de question), un ternaire, c’est :
condition ? valeur_retour_si_condition_respectée :
valeur_retour_si_condition_non_respectée
Pour ton problème il suffit d’initialiser systématiquement @truc avec
une instance du modèle
Donc dans ton controlleur : @truc = Truc.new(params[:truc])
Cette instruction ne plante pas même si (params[:truc]==nil)
Tu peux effectivement utiliser un before_filter pour faire cette
initialisation si tu doit l’effectuer dans plusieurs méthode du
controlleur.
il ne te reste plus qu’à faire
<%= f.text_field(“name”) %>
Dans ta vue si tu as choisis la syntaxe à base de
form_for :truc, @truc […] do |f|
Sinon
<%= text_field(“truc”,“name”) %>
j’aime bien les animations avec le javascript
d’après mon peu d’expérience, et mes multiples lectures :
- tu aimes bien, certes, mais tu fais un site POUR les internautes
- l’accès direct aux données est important, et (c’est mon avis perso)
ne vaut meme pas la peine d’etre mis en cause
- encore attention aux internautes (bcp plus nombreux qu’on ne croit)
qui n’ont pas Javascript (parfois ce n’est meme pas un choix pour eux)
- AJAX se rajoute à la fin, mais se conçoit dès le début
mais sinon c’est très bien de te questionner dès maintenant, tu es
peut-etre en train d’éviter un erreur grossière.
gUI
–
Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/
2008/2/11 Sébastien Lamy [email protected]:
22: Name
Christophe
valeur_retour_si_condition_non_respectée
Dans ta vue si tu as choisis la syntaxe à base de
form_for :truc, @truc […] do |f|
Sinon
<%= text_field(“truc”,“name”) %>
Justement, le problème est situé sur params[:key][:subkey]. Si jamais
params[:key] n’est pas initialisé, alors l’instruction
params[:key][:subkey] plantera. Le but de la ternaire ici est d’éviter
cela :
@truc = params[:key].nil? ? ‘empty’ : params[:key][:subkey]
idéalement, je m’arrangerais pour que la recherche ne se trouve que
dans un hash et non dans un sous-hash, ce qui permettrait d’écrire :
@truc = params[:search_query] || ‘empty search’
ou la même chose dans la vue (bien que ca soit ‘moins’ propre).
Je n’ai certes pas tout détaillé et j’aurais probablement du.
Fabien J.
2008/2/11 Sébastien Lamy [email protected]:
une instance du modèle
form_for :truc, @truc […] do |f|
@truc = params[:key].nil? ? ‘empty’ : params[:key][:subkey]
je suis totalement d’accord, mais vu le besoin j’avais des doutes sur
l’existance d’un modèle utilisé directement pour les recherches.
–
Fabien J.
Re Nicolas,
je te suggère aussi de lire ceci si tu veux travailler un peu l’aspect
référencement (ce qui je pense vaudrait le coup vu que ton site
contient principalement du contenu):
http://blog.logeek.fr/2008/1/30/about-sitemaps-and-their-submission-to-search-engines
a+
Thibaut Barrère / LoGeek
http://blog.logeek.fr - about writing software
http://evolvingworker.com - tools for a better day
Merci, du coup pour avoir des “pages” accessible sans javascript, je
songe à renseigner la variable :href dans mes link_to_remote.
<%= link_to_remote("#{truncate(news.title,38)}",
{:url => {:action
=> “show_news”, :id => news}},
{:href =>
url_for({ :action => “show_news”, :id => news})}) %>
et utiliser un redirect_to xxxx unless request.xhr?
Mais si j’ai bien compris ça m’oblige à dupliquer tout mes rhtml pour
les cas ou il n’y a pas de javascript?
Fabien J. a écrit :
Cette instruction ne plante pas même si (params[:truc]==nil)
<%= text_field(“truc”,“name”) %>
Justement, le problème est situé sur params[:key][:subkey]. Si jamais
params[:key] n’est pas initialisé, alors l’instruction
params[:key][:subkey] plantera. Le but de la ternaire ici est d’éviter
cela :
J’ai bien ententendu que params[:key][:subkey] plante si params[:key]
est nul.
Le code que je propose évite de faire appel à params[:key][:subkey] en
utilisant la méthode standard de rails: instancier un nouvel objet du
modèle à partir de params[:key]. Ca marche même si params[:key] est nul,
et ça évite de faire appel à params[:key][:subkey]. C’est pas la bonne
soluce?
D’autant plus que si on se retrouve avec un truc du style
params[:key][:subkey], c’est clairement que ce params[:key] est obtenu
grâce à un formulaire qui correspond à un modèle.
@truc = params[:key].nil? ? ‘empty’ : params[:key][:subkey]
idéalement, je m’arrangerais pour que la recherche ne se trouve que
dans un hash et non dans un sous-hash, ce qui permettrait d’écrire :
@truc = params[:search_query] || ‘empty search’
Oui, mais seulement si params[:key] ne correspond pas à un objet du
modèle. Sinon le mieux c’est d’instancier un objet du modèle avec @truc
= Truc.new(params[:key])
Le formulaire de recherche est lié à un modèle, mais je souhaite
l’afficher sur ‘presque’ toutes les pages du site.
Le truc d’instancier @truc dans le contrôleur avec un before filter
marche super bien. Ca me permet aussi de ne le faire que dans les
contrôleurs où j’en ai besoin et du coup ma vue est beaucoup plus
propre. Je pourrais aussi l’instancier dans le contrôleur de
l’application, comme ça je suis sûr de ne pas l’oublier ?
Merci pour votre aide.
Christophe