ruby-on-rails link_to更新(无表单)

a2mppw5e  于 2023-03-04  发布在  Ruby
关注(0)|答案(3)|浏览(159)

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

路线:

resources :users do
  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 "Add as friend", user_friend_path(current_user, :method=>'put') %>

但是当我点击链接时,它试图进入显示操作。
做这件事的正确方法是什么?

dfddblmv

dfddblmv1#

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

将插入一个属性“data-method”设置为“put”的链接,这将反过来被rails javascript拾取并在后台转换为一个表单...我猜这就是你想要的。
你应该考虑使用:post,因为你是在两个用户之间创建一个新的链接,而不是更新它。

gojuced7

gojuced72#

问题是您将该方法指定为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
ecbunoof

ecbunoof3#

在rails 7中,这对我来说非常有效:

<% if page.published? %>
  <%= button_to 'Unpublish', page_path(page: { status: "draft" }), { method: :patch, form: { data: { turbo: true } } } %>  
<% else %>
  <%= button_to 'Publish', page_path(page: { status: "published" }), { method: :patch, form: { data: { turbo: true } } } %> 
<% end %>

注:你可以通过删除form: { data: { turbo: true } }来进一步简化它--我之所以包含它,是因为我的应用程序默认关闭了turbo,但大多数人可能不会,所以你可以删除它。

相关问题