link_to更新(没有表格)

时间:2011-01-20 19:53:02

标签: ruby-on-rails routes link-to put

我想要一个更新资源的链接,而不使用HTML表单。

路线:

resources :users do
resource :profile, :controller=>"profiles"
 resources :friends
end    

佣金路线:

 user_friend GET /users/:user_id/friends/:id(.:format){:action=>"show", :controller=>"friends"}
             PUT /users/:user_id/friends/:id(.:format){:action=>"update", :controller=>"friends"}

我想通过简单的链接使用put来更新朋友,如下所示:
<%= link_to“添加为朋友”,user_friend_path(current_user,:method =>'put')%>

但是当Rails遇到这个链接时,他试图进入表演行动 问题是:这样做的正确链接是什么?

2 个答案:

答案 0 :(得分:35)

link_to "Add as friend", user_friend_path(current_user, @friend), :method=> :put

将插入一个属性'data-method'设置为'put'的链接,然后由rails javascript拾取并转换为幕后形式...我想这就是你想要的。< / p>

您应该考虑使用:post,因为您在两个用户之间创建了一个新链接,而不是更新它。似乎。

答案 1 :(得分:0)

问题是您将方法指定为URL查询参数,而不是link_to方法的选项。

这是实现所需内容的一种方法:

<%= link_to "Add as friend", user_friend_path(current_user, friend), method: 'put' %>
# or more simply:
<%= link_to "Add as friend", [current_user, friend], method: 'put' %>

使用link_to助手来更新模型属性的另一种方法是传递查询参数。例如:

<%= link_to "Accept friend request", friend_request_path(friend_request, friend_request: { status: 'accepted' }), method: 'patch' %>
# or more simply:
<%= link_to "Accept friend request", [friend_request, { friend_request: { status: 'accepted' }}], method: 'patch' %>

这将发出这样的请求:

Started PATCH "/friend_requests/123?friend_request%5Bstatus%5D=accepted"
Processing by FriendRequestsController#update as 
  Parameters: {"friend_request"=>{"status"=>"accepted"}, "id"=>"123"}

您可以通过以下方式处理控制器操作:

def update
  @friend_request = current_user.friend_requests.find(params[:id])
  @friend_request.update(params.require(:friend_request).permit(:status))
  redirect_to friend_requests_path
end