自定义操作的 form_for 和 form_tag 参数

form_for and form_tag parameters for custom action

我想在友谊控制器中使用 drop 操作来删除友谊请求,我正在努力了解如何创建工作表单和工作路线。

我在config/routes.rb

中添加了以下路由
resources :friendships, only: [:create, :destroy] do
  member do
    post :drop
  end
end

这将生成命名路由 drop_friendship_path(id)
我现在的问题是如何创建工作表单,即我必须使用 form_forform_tag.

需要哪些参数

鉴于我会迭代 @users 请求友谊,我不知道要删除的请求的 id,所以我不能使用上面命名的路由。以下哪一项是正确的?

<%= form_for(current_user.friendship_request.find_by(requester_id: user.id), url: { action: drop }) %>

<%= form_tag({controller: "friendships_controller", action: "drop"}) do %>

我费了好大劲才找到有关 form_forform_tag 参数的文档。 api documentation 表示 :url form_for 的参数可以用与传递给 url_forlink_to 的值相同的方式表示。因此,例如您可以直接使用命名路由。 url_forlink_to 上的文档没有添加任何其他内容。

我在 form helpers section of guides.rubyonrails.org for form_for and form_tag 中只找到了示例,而不是详尽的文档,所以我意识到 url for form_for 可以有子参数的散列(但是只有 action 被报告),并且 controlleraction 参数可以传递给 form_tag.

form_for 助手中 url 散列的完整参数列表是什么?
form_tag 助手的相关参数列表是什么?
我的表格中需要哪些?

如果我没有指定控制器和动作,而是在 form_for 或 form_tag 中使用:

url: drop_friendship_path(@friendship_request) 

并在 drop 操作中定义了 @friendship_request,这行得通吗?

更好的方法是根据您的目的使用 button_tolink_to 助手。 button_to 生成一个表单。 link_to 生成 link,但也可以发送带有 {method: :post} 选项的 post 请求。

为什么您认为不能使用 drop_friendship_path(id) 辅助方法?您可以:

<% request_id = current_user.friendship_request.find_by(requester_id: user.id) %>

<%= button_to "Drop", drop_friendship_path(request_id) %>
<!-- or -->
<%= link_to "Drop", drop_friendship_path(request_id), method: :post %>

为什么不使用现有的 destroy 操作而不是 drop 来删除友谊?

而且,为每个用户发送一个单独的查询来获取好友记录也不是一件好事。您应该考虑如何避免这种情况。解决方法有很多,但不是问题的主题。