2011-04-25 35 views
1

我正在制作一个使用rails的网站,我迫切需要帮助我如何创建一个链接,点击它时将更新数据库中的一个属性,但只有当卡嗒一声。笔者有这样的代码:rails - 如何通过链接更改数据库值

<%= 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 %> 

当我点击它增加了6球员的能量,而不是仅仅2或4 enter code here该链接的链接之一就是对myProperty的页面,我希望它在单击时返回到myproperty页面。 我还没有找到解决方案,我真的很感激,如果有人可以帮助我与此。

+0

非常感谢你们!我会去尝试你说的道格并回复你。 – 2011-04-27 05:19:25

+0

我已将您的未注册帐户合并为一个,您现在应该能够评论您的问题及其答案,并接受帮助您的答案。 – 2011-04-27 07:30:37

回答

2

您不应该使用GET对服务器做任何更改。一些浏览器甚至“预取”链接在页面上的数据,因此它可以在服务器上进行更改,而用户不知道它。

无论何时在服务器上进行任何更改,始终使用POST,浏览器将再次询问用户是否要再次提交请求。

在CRUD - 创建,检索,更新和删除中,只能使用检索GET,其他检测通过POST完成。有关于使用PUTDELETE的说法,但实际上,它是通过使用_method参数或类似名称的POST完成的。

参见:Why Ruby on Rails books or references always say Update is by PUT and Destroy is by DELETE when it is not?

+0

+1非常好陈述 – Spyros 2011-04-25 05:09:34

+0

这里是一个大约2005年预取“问题”的链接:[谷歌加速器需要召回](http://www.loudthinking.com/arc/000454.html) – Zabba 2011-04-25 05:39:18

+0

使用GET v。POST是Pamela的例子中最小的问题。她应该使用Rails的MVC功能。在这一点上讨论适当的http方法只会导致混淆。 – 2011-04-26 14:44:56

0

但是你的HTTP动词进行,你的代码中有一个概念的缺陷:

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

当你打开这个页面,而产生@ player.update_attributes通话将闪光一次链接。实际的数据库更改必须在控制器内发生(在这种情况下,myproperty_path的路由目标)。

另外我完全同意你应该使用POST请求。

8

你正在以一种根本不正确的方式解决这个问题。 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 } %> 
在你看来

,并在你的PlayerActionsController相应的控制器动作,或称之为

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 

这样的行动只是发生当用户点击链接时。当然,你将需要处理任何重定向或ajax渲染,以及验证等。但这通常是你的Rails代码应该如何构造的。

相关问题