Ruby on Rails中的link_to和put方法

29

我是Rails的新手,试图使用link_to助手创建一个发出PUT请求而不是GET请求的链接。具体来说,我正在尝试创建一个链接,在管理员面板中激活用户帐户。我正在使用Rails 3.0.5。

我的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">激活</a>

我想要生成的是:<a href = "/admin/users/7/activate" data-method="put">激活</a>

我知道我可以使用button_to,但我已经为此问题苦苦挣扎了一段时间,我很困惑为什么我看到这种行为,因为其他教程说我正在做的应该是有效的。我该如何创建所需行为的link_to helper?

3个回答

40

更新 - 如果没有指定方法,link_to助手将执行GET请求。

最好在路由文件中指定确切的请求类型,而不是使用match。可以尝试通过在路由中将match替换为put

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

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

admins 控制器中放置 activate_user 方法。 文档中有关于 link_to 辅助函数的更多信息。


1
以上的 put 路径,rake routes 会产生什么?你能发一下吗? - prasvin
4
这对我没用。如果link_to中没有定义方法,我会收到“无路由匹配[GET]”的错误信息。 - ndemoreau
1
link_to-helper 会执行 GET 请求,除非你指定了一个方法。因此,这个答案至少部分是不正确的。我要点踩。 - Jesper
4
没有使用:method=>:put就无法正常工作。这不应该被接受。 - Grant Birchmeier
2
只有在更改路由时才能使其正常工作。请在贬低之前仔细查看答案。 - maksim
1
在Rails 7中,这应该是 , data: { 'turbo-method': :put } - riley

32

link_to 认为 :method => :put 是路径哈希的一部分。你需要告诉它不是这样。将你的路径用括号包起来。

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

现在link_to将把:method => :put视为选项,而不是链接路径的一部分。

顺便提一下,尽可能使用路由辅助方法而不是路径哈希。这可以使代码保持整洁,并避免像这样的小问题。


1
如果您正在使用link_to,则可以使用以下语法。
<%= link_to admin_subscription_path(user), method: :put do %>
 # can put html & css here
<% end %>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接