Ruby on rails rails-如何使用链接更改数据库值
我正在使用rails创建一个网站,我非常需要帮助,如何创建一个链接,当单击该链接时,它将更新数据库中的属性,但仅当单击时。我有以下代码:Ruby on rails rails-如何使用链接更改数据库值,ruby-on-rails,database,link-to,Ruby On Rails,Database,Link To,我正在使用rails创建一个网站,我非常需要帮助,如何创建一个链接,当单击该链接时,它将更新数据库中的属性,但仅当单击时。我有以下代码: <%= link_to (myproperty_path) do %> <% @player.update_attribute("energy", @player.energy + 2) %><span>Take a Nap</span> <%end%> 小睡一会儿 但问题是,每当我刷新页面时
<%= link_to (myproperty_path) do %>
<% @player.update_attribute("energy", @player.energy + 2) %><span>Take a Nap</span>
<%end%>
小睡一会儿
但问题是,每当我刷新页面时,它都会更新属性,当我转到网站上的另一个页面时,它会再次更新属性。当我点击它时,它可以工作,但我希望它只在点击时工作,就这样。另外,如果我在同一页面上有两个这样的链接,单击一个链接就好像我同时单击两个链接一样。以下是我在myproperty页面上的内容:
<%= render 'sidebar' %>
<div id="yui-main" class="yui-b">
<h2>My Property</h2>
<br \>
<p><b>Property: </b><%= @player.property %><br \><br \>
<%= link_to (myproperty_path) do %>
<span>Take a Nap</span>
<% if @player.energy <= 98 && @player.energy != 100 %>
<% @player.update_attribute("energy", @player.energy + 2) %>
<% end %>
<% end %>
<br \>
<%= link_to (myproperty_path) do %>
<span>Sleep</span>
<% if @player.energy <= 96 && @player.energy != 100 %>
<% @player.update_attribute("energy", @player.energy + 4) %>
<% end %>
<% end %>
<% if @player.property != "My Car" %>
<b>Rent: </b><br \>
<br \>
<b>Bedroom</b><br \>
<% end %>
我的财产
属性:
小睡一会儿
您不应该使用GET
对服务器进行任何更改。一些浏览器甚至“预取”页面上链接的数据,因此它可以在用户不知情的情况下在服务器上进行更改
在服务器上进行任何更改时,始终使用POST
,浏览器将再次询问用户是否再次提交请求
在CRUD-创建、检索、更新和删除中,只能使用GET
执行检索,其他操作通过POST
完成。有人说要使用PUT
和DELETE
,但实际上,这是通过POST
使用\u方法
参数或类似名称来完成的
请参阅:您不应该使用GET
对服务器进行任何更改。一些浏览器甚至“预取”页面上链接的数据,因此它可以在用户不知情的情况下在服务器上进行更改
在服务器上进行任何更改时,始终使用POST
,浏览器将再次询问用户是否再次提交请求
在CRUD-创建、检索、更新和删除中,只能使用GET
执行检索,其他操作通过POST
完成。有人说要使用PUT
和DELETE
,但实际上,这是通过POST
使用\u方法
参数或类似名称来完成的
请参阅:无论您如何处理HTTP谓词,您的代码都有一个概念缺陷:
<%= link_to (myproperty_path) do %>
<% @player.update_attribute("energy", @player.energy + 2) %><span>Take a Nap</span>
<%end%>
小睡一会儿
打开此页面时,@player.update\u attributes调用将在生成链接时触发一次。实际的数据库更改必须在控制器内进行(在本例中为myproperty_path的路由目标)
此外,我完全同意您应该使用POST请求。无论您如何处理HTTP谓词,您的代码都有一个概念缺陷:
<%= link_to (myproperty_path) do %>
<% @player.update_attribute("energy", @player.energy + 2) %><span>Take a Nap</span>
<%end%>
小睡一会儿
打开此页面时,@player.update\u attributes调用将在生成链接时触发一次。实际的数据库更改必须在控制器内进行(在本例中为myproperty_path的路由目标)
此外,我完全同意您应该使用POST请求。您这样做根本不正确。Rails的设计目的不是在视图中包含业务逻辑,尤其是更新记录的逻辑
你想要的是
<%= link_to "Take a nap", {:controller => "player_actions", :action => "nap", :id => @player.id} %>
<%= link_to "Sleep", {:controller => "player_actions", :action => "sleep", :id => @player.id } %>
这样,只有当用户单击链接时,操作才会发生。当然,您还需要处理任何重定向或ajax渲染,以及验证等,但这通常是Rails代码的结构 你这样做根本不正确。Rails的设计目的不是在视图中包含业务逻辑,尤其是更新记录的逻辑
你想要的是
<%= link_to "Take a nap", {:controller => "player_actions", :action => "nap", :id => @player.id} %>
<%= link_to "Sleep", {:controller => "player_actions", :action => "sleep", :id => @player.id } %>
这样,只有当用户单击链接时,操作才会发生。当然,您还需要处理任何重定向或ajax渲染,以及验证等,但这通常是Rails代码的结构 这里有一个大约2005年的链接,指向预取“问题”:使用getv。波斯特是帕梅拉例子中最小的错误。她应该使用Rails的MVC特性。在这一点上讨论合适的http方法只会在这一点上引起混乱。波斯特是帕梅拉例子中最小的错误。她应该使用Rails的MVC特性。在这一点上讨论合适的http方法只会在这一点上引起混乱。非常感谢你们!我会试试你说的话,道格,然后回复你。我已经将你未注册的帐户合并为一个帐户,你现在应该可以对你的问题及其答案发表评论,并接受对你有帮助的答案。非常感谢你们!道格,我会试试你说的话,然后再回复你。我已经将你未注册的帐户合并为一个帐户,你现在应该可以对你的问题及其答案发表评论,并接受对你有帮助的答案。