Ruby on rails 在Rails中为多态关系中的like按钮构建表单

Ruby on rails 在Rails中为多态关系中的like按钮构建表单,ruby-on-rails,ruby,forms,ruby-on-rails-4,social-media-like,Ruby On Rails,Ruby,Forms,Ruby On Rails 4,Social Media Like,我正在尝试为一个类似的按钮构建一个表单。这种类似的模型对于不同类型的模型(评论/帖子等)具有多态性,并且属于某个用户 例如,当这个用户正在查看一个博客项目时,我想在帖子下面显示一个like按钮。我已将我的路由设置为,类似的路由始终嵌套在它们所指定的多态对象中: 例如,对于职位: #routes.rb resources :posts do resources :likes, only: [:create, :destroy] end 因此,post链接看起来像/posts/:post\u

我正在尝试为一个类似的按钮构建一个表单。这种类似的模型对于不同类型的模型(评论/帖子等)具有多态性,并且属于某个用户

例如,当这个用户正在查看一个博客项目时,我想在帖子下面显示一个like按钮。我已将我的路由设置为,类似的路由始终嵌套在它们所指定的多态对象中:

例如,对于职位:

#routes.rb
resources :posts do
   resources :likes, only: [:create, :destroy]
end
因此,post链接看起来像
/posts/:post\u id/likes/
(方法:post)

在控制器中,我创建一个新的Like对象,将其分配给用户并保存。这很好用

问题是当我试图创建删除表单时。我真的不知道如何创建它,我知道链接应该是
/posts/:post\u id/like/:id
(方法:Delete),但这样配置会导致错误

我认为表单也可以重构,但我不知道如何为这种“复杂”关系生成表单

\shared/like\u button.html.haml
-如果不是,当前用户是否喜欢@post.u
=form_for(@post.likes.build,url:post_likes_path(@post))do|f|
=f.提交
-否则
=form_for(@post.likes.find_by(user_id:current_user.id),url:post_like_path(@post),html:{method::delete})do|f|
=f.提交

我认为主要的问题是,
post\like\u路径(@post)
无法正确渲染,因为我不知道类似的
:id
。因此,在尝试构建链接时,我在
PostsController\show
中不断遇到
ActionController::UrlGenerationError
错误。

无需使用实际表单,您可以通过指向的链接来实现。下面是一个带有基本文本链接的示例(以确保它正常工作)

然后使用图像/按钮作为链接本身

- if not @post.is_liked_by current_user
  = link_to post_like_path(@post), method: :post do
    # some html image/button
- else
  = link_to post_like_path([@post, @post.likes.find_by(user_id: current_user.id)]), method: :delete do
    # some html image/button

在已接受答案的帮助下更新了此代码,以便将来任何人都可以使用“链接到”。

无需使用实际表单,您可以使用“链接到”。下面是一个带有基本文本链接的示例(以确保它正常工作)

然后使用图像/按钮作为链接本身

- if not @post.is_liked_by current_user
  = link_to post_like_path(@post), method: :post do
    # some html image/button
- else
  = link_to post_like_path([@post, @post.likes.find_by(user_id: current_user.id)]), method: :delete do
    # some html image/button

在已接受答案的帮助下更新了此代码,以便将来任何人都可以使用“链接到”。

无需使用实际表单,您可以使用“链接到”。下面是一个带有基本文本链接的示例(以确保它正常工作)

然后使用图像/按钮作为链接本身

- if not @post.is_liked_by current_user
  = link_to post_like_path(@post), method: :post do
    # some html image/button
- else
  = link_to post_like_path([@post, @post.likes.find_by(user_id: current_user.id)]), method: :delete do
    # some html image/button

在已接受答案的帮助下更新了此代码,以便将来任何人都可以使用“链接到”。

无需使用实际表单,您可以使用“链接到”。下面是一个带有基本文本链接的示例(以确保它正常工作)

然后使用图像/按钮作为链接本身

- if not @post.is_liked_by current_user
  = link_to post_like_path(@post), method: :post do
    # some html image/button
- else
  = link_to post_like_path([@post, @post.likes.find_by(user_id: current_user.id)]), method: :delete do
    # some html image/button
在已接受答案的帮助下更新了此代码,以便以后查看的任何人都可以使用链接。

这应该可以:

= form_for([@post, @post.likes.find_by(user_id: current_user.id)], html: {method: :delete}) do |f|
url:post\u like\u路径(@post)
在代码中需要第二个参数(
like
对象)。这就是错误所在。 但是,如果将嵌套资源作为数组放在helper的
form_的第一个参数中,实际上并不需要它

如果传递给form_for的记录是一个资源,即它对应于 一组RESTful路由,例如使用中的resources方法定义 config/routes.rb。在这种情况下,Rails将简单地推断出适当的 记录本身的URL。 (来源:)

如果资源嵌套在另一个资源中,则可以传递资源数组

现在。。。您可能也希望将此代码重新用于其他多态模型。您可以通过如下方式将
@post
@comment
传递给您的部分角色:

= render :partial => 'like_button', locals: {likable: @post}
= form_for([likable, likable.likes.find_by(user_id: current_user.id)], html: { method: :delete}) do |form|
然后像这样重构您的分部代码:

= render :partial => 'like_button', locals: {likable: @post}
= form_for([likable, likable.likes.find_by(user_id: current_user.id)], html: { method: :delete}) do |form|
这应该起作用:

= form_for([@post, @post.likes.find_by(user_id: current_user.id)], html: {method: :delete}) do |f|
url:post\u like\u路径(@post)
在代码中需要第二个参数(
like
对象)。这就是错误所在。 但是,如果将嵌套资源作为数组放在
helper的
form_的第一个参数中,实际上并不需要它

如果传递给form_for的记录是一个资源,即它对应于 一组RESTful路由,例如使用中的resources方法定义 config/routes.rb。在这种情况下,Rails将简单地推断出适当的 记录本身的URL。 (来源:)

如果资源嵌套在另一个资源中,则可以传递资源数组

现在。。。您可能也希望将此代码重新用于其他多态模型。您可以通过如下方式将
@post
@comment
传递给您的部分角色:

= render :partial => 'like_button', locals: {likable: @post}
= form_for([likable, likable.likes.find_by(user_id: current_user.id)], html: { method: :delete}) do |form|
然后像这样重构您的分部代码:

= render :partial => 'like_button', locals: {likable: @post}
= form_for([likable, likable.likes.find_by(user_id: current_user.id)], html: { method: :delete}) do |form|
这应该起作用:

= form_for([@post, @post.likes.find_by(user_id: current_user.id)], html: {method: :delete}) do |f|
url:post\u like\u路径(@post)
在代码中需要第二个参数(
like
对象)。这就是错误所在。 但是,如果将嵌套资源作为数组放在
helper的
form_的第一个参数中,实际上并不需要它

如果传递给form_for的记录是一个资源,即它对应于 一组RESTful路由,例如使用中的resources方法定义 config/routes.rb。在这种情况下,Rails将简单地推断出适当的 记录本身的URL。 (来源:)

如果资源嵌套在另一个资源中,则可以传递资源数组

现在。。。您可能也希望将此代码重新用于其他多态模型。您可以通过如下方式将
@post
@comment
传递给您的部分角色:

= render :partial => 'like_button', locals: {likable: @post}
= form_for([likable, likable.likes.find_by(user_id: current_user.id)], html: { method: :delete}) do |form|
然后像这样重构您的分部代码:

= render :partial => 'like_button', locals: {likable: @post}
= form_for([likable, likable.likes.find_by(user_id: current_user.id)], html: { method: :delete}) do |form|
这应该起作用:

= form_for([@post, @post.likes.find_by(user_id: current_user.id)], html: {method: :delete}) do |f|
url:post\u like\u路径(@post)
在代码中需要第二个参数(
like
对象)。这就是错误所在。 但是,如果将嵌套资源作为数组放在
helper的
form_的第一个参数中,实际上并不需要它

如果传递给form_for的记录是一个资源,即它对应