我想要一个更新资源的链接,而不使用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遇到这个链接时,他试图进入表演行动 问题是:这样做的正确链接是什么?
答案 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