Rails – cómo cambiar los valores de la base de datos con un enlace

Estoy creando un sitio web utilizando Rails y necesito ayuda desesperadamente. ¿Cómo creo un enlace que al hacer clic en él actualizará un atributo en la base de datos, pero solo cuando se haga clic en él?

 Take a Nap  

pero el problema con esto es que cada vez que actualizo la página, actualiza el atributo y cuando voy a otra página en el sitio web, actualiza el atributo nuevamente. Funciona cuando hago clic en él, pero quiero que funcione solo cuando se hace clic y eso es todo. Además, si tengo dos de estos enlaces en la misma página, hacer clic en un enlace actuará como si estuviera haciendo clic en ambos enlaces al mismo tiempo. Aquí está lo que tengo para la página myproperty:

  

My Property


Property:

Take a Nap <% if @player.energy
Sleep <% if @player.energy Rent:

Bedroom

Cuando hago clic en uno de los enlaces, agrega 6 a la energía del jugador en lugar de solo 2 o 4. enter code here El enlace está en la página myproperty y quiero que regrese a la página myproperty cuando se haga clic. No he encontrado una solución en ningún lugar, realmente agradecería que alguien me ayudara con esto.

Usted va sobre esto de una manera fundamentalmente incorrecta. Rails no está diseñado para tener lógica empresarial en sus vistas, ¡especialmente la lógica que actualiza los registros!

Lo que quieres es algo como

 <%= link_to "Take a nap", {:controller => "player_actions", :action => "nap", :id => @player.id} %> <%= link_to "Sleep", {:controller => "player_actions", :action => "sleep", :id => @player.id } %> 

en su vista, y una acción del controlador correspondiente en su PlayerActionsController, o como quiera que lo llame

 def nap player = Player.find(params[:id]) player.update_attribute(:energy, player.energy + 2) end def sleep player = Player.find(params[:id]) player.update_attribute(:energy, player.energy + 4) end 

De esta manera, las acciones solo suceden cuando el usuario hace clic en el enlace. Por supuesto, también tendrá que manejar las redirecciones o la representación ajax, así como la validación, etc. Pero generalmente es así como debe estructurarse su código Rails.

Nunca debes usar un GET hacer cambios en el servidor. Algunos navegadores incluso “precargan” los datos vinculados en la página, por lo que puede hacer cambios en el servidor sin que el usuario lo sepa.

Utilice siempre un POST cada vez que se realice un cambio en el servidor, y el navegador le preguntará al usuario si la solicitud se enviará nuevamente.

En CRUD: Crear, Recuperar, Actualizar y Eliminar, solo se debe usar Recuperar utilizando GET , los demás se realizan a través de POST . Hay comentarios sobre el uso de PUT y DELETE , pero en la práctica, se realiza a través de un POST utilizando un _method o un nombre similar.

Ver: ¿Por qué los libros o referencias de Ruby on Rails siempre dicen que la Actualización es por PUT y que Destroy es por ELIMINAR cuando no lo es?

Sin embargo, si continúa con los verbos HTTP, su código tiene un defecto de concepto:

 <%= link_to (myproperty_path) do %> <% @player.update_attribute("energy", @player.energy + 2) %>Take a Nap <%end%> 

Al abrir esta página, la llamada @ player.update_attributes se activará una vez mientras se genera el enlace. El cambio real de la base de datos debe realizarse dentro de un controlador (en este caso, el destino de enrutamiento para myproperty_path).

Además, estoy totalmente de acuerdo en que debe utilizar una solicitud POST.