2 votes

Rails pour débutants : problème de submit_tag

Ok, donc en gros je fais une application web où je veux que l'utilisateur entre une valeur donnée pour une constante nommée @radius que je vais utiliser plus tard.

Imaginons que j'ai le code suivant dans une vue nommée "business/index.html.erb".

<%= form_tag root_path do %>
   <%= number_field_tag :radius %>
   <%= submit_tag "add" %>
<% end %>

Et puis j'ai le code suivant dans mon business_controller sous l'action index :

@radius= params[:radius] || @radius || 1

Mon fichier de routes :

root :to => 'business#index'
post "business/index"

En fait, la vue est belle, mais lorsque je modifie le rayon et que je l'envoie, la valeur par défaut est toujours de un, comme si params[:radius] était nul. Avez-vous une idée de ce qui m'échappe ? Je suis sûr que c'est assez élémentaire.

EDIT :

Voici une partie du fichier journal qui, je crois, correspond à ce qui m'a été demandé.

Started POST "/" for 127.0.0.1 at 2013-06-20 02:00:31 -0430
Processing by BusinessController#index as HTML
Parameters: {"utf8"=>"", "authenticity_token"=>"CaD40O9gAedbeDepeDHtrMNNWzD/uBznHZ30ZGy+c6Q=", "radius"=>"2", "commit"=>"add"}
  [1m[35mBusiness Load (18.0ms)[0m  SELECT businesses.*, 6371.0 * 2 * ASIN(SQRT(POWER(SIN((10.5083644 - businesses.latitude) * PI() / 180 / 2), 2) + COS(10.5083644 * PI() / 180) * COS(businesses.latitude * PI() / 180) * POWER(SIN((-66.83536699999999 - businesses.longitude) * PI() / 180 / 2), 2))) AS distance, CAST(DEGREES(ATAN2( RADIANS(businesses.longitude - -66.83536699999999), RADIANS(businesses.latitude - 10.5083644))) + 360 AS decimal) % 360 AS bearing, ( businesses.reviews_count / (nullif(businesses.reviews_count + MAX(businesses.reviews_count) OVER(),0)) ) * businesses.rating + (MAX(businesses.reviews_count) OVER() / (nullif(businesses.reviews_count+MAX(businesses.reviews_count) OVER(),0))) * AVG(businesses.rating) OVER() as ranking FROM "businesses" WHERE (businesses.latitude BETWEEN 10.490377967881624 AND 10.526350832118375 AND businesses.longitude BETWEEN -66.85366024099285 AND -66.81707375900713 AND 6371.0 * 2 * ASIN(SQRT(POWER(SIN((10.5083644 - businesses.latitude) * PI() / 180 / 2), 2) + COS(10.5083644 * PI() / 180) * COS(businesses.latitude * PI() / 180) * POWER(SIN((-66.83536699999999 - businesses.longitude) * PI() / 180 / 2), 2))) <= '2') GROUP BY businesses.id ORDER BY distance ASC, ranking DESC
  Rendered C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/gmaps4rails-1.5.6/app/views/gmaps4rails/_gmaps4rails.html.erb (1.0ms)

2voto

ipd Points 3365

Je pense que vous comprenez mal le @radius et son fonctionnement. Il s'agit d'une variable d'instance du contrôleur, elle sera donc réinitialisée à la valeur suivante nil entre chaque demande. Si vous voulez faire persister la valeur de radius entre les requêtes, vous devrez le faire dans une base de données, ou dans le cookie de l'utilisateur.

La mise en œuvre d'un cookie de session peut ressembler à ceci :

session[:radius] = params[:radius] || session[:radius] || 1

Ensuite, pour votre vue et votre formulaire, vous devrez faire référence à la session directement, ou définir @radius = session[:radius] dans votre action de contrôleur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X