2012-02-16 160 views
20

我是Rails的新手,我试图使用link_to helper来创建一个发出PUT请求而不是GET请求的链接。具体来说,我试图创建一个链接,从管理面板中激活我的应用中的用户帐户。我正在使用Rails 3.0.5。Ruby on Rails link_to使用put方法

我的routes.rb文件具有:

match '/admin/users/:id/activate' => 'admin#activate_user', 
    :action => :activate_user, :via => :put 

我的视图具有:

link_to 'Activate', :action => :activate_user, :id => user.id, :method => :put 

然而,这产生的URL(例如)/admin/users/7/activate?method=put与源代码<a href="/admin/users/7/activate?method=put">Activate</a>

我想产生,而是<a href = "/admin/users/7/activate" data-method="put">Activate</a>

我知道我可以使用button_to,但我一直在这个问题搏斗了一会儿,我很困惑,为什么我看到这种行为,当其他教程说,我在做什么应该是有效的。我如何才能创建一个link_to帮手来处理我想要的行为?

回答

25

更新 - 该link_to助手将执行一个GET,除非指定一个方法。

它更好地指定确切的请求类型,而不是您的路由文件中的match。怎么样在的航线put更换match为:

put '/admin/users/:id/activate' => 'admins#activate_user', :as => 'activate_user' 

link_to 'Activate', activate_user_path(user.id), method: :put 

activate_user方法应该驻留在admins控制器。 docs有关于link_to帮手的更多信息。

+1

耙路线为上述路径产生了什么?你可以发布吗? – prasvin 2012-02-16 05:32:08

+1

这工作,谢谢!这是最干净的解决方案:) – maksim 2012-02-16 06:26:37

+4

这不适合我。如果在link_to中没有定义方法,我会得到一个No route matches [GET]错误消息。 – ndemoreau 2012-08-14 06:10:37

30

link_to认为:method => :put是路径哈希的一部分。否则你必须告诉它。用括号括起你的路径。

link_to 'Activate', {:action => :activate_user, :id => user.id}, :method => :put 

现在link_to将识别:method => :put作为一个选项,链接的路径不是一部分。

请注意,尽可能使用路由帮助而不是路径哈希。保持事情的美好和整洁,并避免这种挑剔的情况。