2009-09-17 8 views
0

Nouveau sur rails ... si dépouillé avec moi.Rails: petit problème searchlogic

J'ai réussi à installer et configurer searchlogic pour la recherche de base (mot-clé). J'ai le problème suivant:

@search = Proposal.search(params[:search]) 
@proposals = @search.all 

Le code ci-dessus fonctionne correctement si je tape un mot clé comme « rouge ». Il fera apparaître tout avec le mot-clé rouge. Ou si je tape "vert", tout apparaîtra avec le mot clé vert. Cependant, quand je tape "rouge vert" dans la boîte de recherche, cela ne fera apparaître les cas où les mots-clés sont à la fois rouge et vert (et ne pas afficher les cas où ils peuvent avoir seulement l'un des deux mots-clés). Oui, j'utilise des keywords_like_any. Je peux voir quel est le problème général via le débogage, keywords_like_any: vert rouge. Le code ci-dessous fonctionne comme je le veux (faire apparaître toutes les instances de rouge OU vert).

@search2 = Proposal.keywords_like_any("red", "green") 
@test = @search2.all 

Je crois ce que je dois faire pour résoudre le problème est tourner le premier code pour afficher params [: recherche] comme un tableau? J'ai essayé de faire des paramètres [: string] .to_s.split (comme indiqué dans railscast) mais cela n'a pas fonctionné.

Si quelqu'un peut me diriger dans la bonne direction, j'apprécierais cela.

+0

quelle classe est params [: recherche]? – perimosocordiae

+0

Je ne suis pas certain de comprendre votre question. Bien que quand je debug params je reçois ceci: --- carte: HashWithIndifferentAccess commit: Soumettre authenticity_token: yfYORg04RDMlEgjr/4004PRTaJ2TJbV0z6Feq + OYXgw = l'action: index contrôleur: utilisateurs recherche: carte: HashWithIndifferentAccess keywords_like_any: asdf category_id_equals: "" En outre, le code mentionné dans la publication d'origine est dans mon contrôleur d'utilisateurs. Je pourrais coller mon code si cela pouvait aider, mais c'est plutôt standard. Merci – asdfasdfasdfasdf

Répondre

0

Le *_like_any est destiné à être utilisé avec des cases à cocher forment des aides (f.check_box) qui sort des tableaux dans votre params hachage par opposition à f.text_field qui produit des chaînes. Si vous voulez continuer à les utiliser avec un f.text_field vous pouvez:

  • diviser le champ avec Javascript côté client à la sortie d'un tableau
  • il fendu dans votre contrôleur

Considérant que votre champ est clavier nommé est un code ici qui devrait résoudre votre problème:

params[:search][:keywords_like_any] = params[:search][:keywords_like_any].split(' ') 
@proposals = Proposal.search(params[:search]) 

Vous pouvez sauter la ligne @proposals = @search.all parce que la recherche resul ts fonctionne comme un tableau.

+0

Cela résout mon problème principal, merci beaucoup! Bien qu'il m'a laissé avec une petite bizarrerie. Maintenant, quand je cherche, après que la page soit rafraichie, ma boîte de recherche est remplie de "redgreen" au lieu de "red green". Impair? – asdfasdfasdfasdf

+0

Puisque vous utilisez un 'form_for, il remplit le' text_field' avec la valeur que vous avez entrée précédemment (qui s'est terminée dans votre objet de recherche). Mais cette valeur est un tableau, donc lorsqu'il est converti en une chaîne. '['rouge', 'vert']' => '" rouge-vert ". @ proposals.keywords_like_any = @ proposals.keywords_like_any.join ("") Pour que le code reste lisible, je renomme la variable '@ proposals' en' @ search', cela n'a pas vraiment de sens si c'est pas le cas. (et complétant ainsi avec '@proposals = @ search.all'). – jhchabran

0

Vous avez dit que vous avez essayé params[:string].to_s.split - Je ne sais pas si cela est une faute de frappe, mais il devrait être params[:search].to_s.split

0

Je ne comprends peut-être pas votre question, mais il me semble que vous essayez d'implémenter quelque chose dans le contrôleur qui appartient à la vue. Si votre vue a ceci:

- form_for @search do |f| 
    = f.text_field :color_like_any 

alors votre exemple de contrôleur initial fonctionnera.

+0

Mon point de vue a ce code ... et ça marche ', comme mentionné plus haut. Cependant, tout simplement pas à la mode que j'attendais/je voulais. – asdfasdfasdfasdf