我正在尝试在博客应用程序的评论中添加投票。但我似乎无法将以下循环内的变量发送给控制器:
import Button from 'antd/lib/button';
控制器:
<% @comments.each do |c| %>
<h1><%= c.title %></h1>
<p><%= c.content %></p>
<p><%= c.user.username %></p>
<% if current_user.id == c.user_id %>
<%= link_to "Edit", edit_comment_path(@post, c)%>
<%= link_to "Delete", delete_comment_path(@post, c), method: :delete, data: { confirm: "Are you sure?" }%>
<% end %>
<% if current_user.id != c.user_id %>
<p>Review this comment</p>
<%= link_to like_path(c), method: :put do %>
Upvote
<%= c.upvote %>
<% end %>
<%= link_to dislike_path(c), method: :put do %>
Downvote
<%= c.downvote %>
<% end %>
<% end %>
<% end %>
路线:
...
def upvote
object_comment = Comment.find(@comment.id)
object_comment.increment!(:upvote)
redirect_to show_path(@post)
end
def downvote
object_comment = Comment.find(@comment.id)
object_comment.increment!(:downvote)
redirect_to show_path(@post)
end
....
我想在upvote和downvote方法中的每个循环上收到表示为'c'的变量,以替换object_comment = Comment.find(@ comment.id)中的@comment,以便增加投票数。这可能吗?
很对,我显然收到以下错误:
NoMethodError(nil:NilClass的未定义方法'id'):
答案 0 :(得分:3)
您的*_path
方法不知道如何处理单个参数。 (如果要将对象传递给链接,则可能需要研究RESTful路由。但是,建议使用当前的路由来解决它,
<%= link_to "Downvote #{c.downvote}" dislike_path(id: c.id) %>
然后应该可以通过id
在控制器中访问此params
属性。
def dislike
@comment = Comment.find(params[:id])
...
end
需要考虑的其他几件事:
在点击链接时执行put
操作是非常不寻常的。您可能需要考虑将其作为get
动作来完成。
downvote
方法返回的每个注释是否有所不同?如果没有,通常的做法是将其包含在控制器的帮助器中。
答案 1 :(得分:1)
您可以在参数中获取ID,请检查以下方法
addClassNames
答案 2 :(得分:1)
我认为您做错了。您需要使用模型 private void PreviewPdfFunc(object sender, MouseButtonEventArgs e)
{
foreach (UserControl cnt in UserControlList)
{
MessageBox.Show(cnt +" Total = " + StackPanelContainer.Children.Count);
}
}
保存用户对注释的操作,例如,模型属于CommentVote
和user
。
然后您需要执行以下操作:
comment
然后在class CommentVote
belongs_to :comment
belongs_to :user
enum type: [:upvote, :downvote]
def self.vote(type:, comment_id:, user_id:)
comment_vote = CommentVote.where(comment_id: comment_id, user_id: user_id).first_or_initialize
comment_vote.type = type
comment_vote.save
end
end
模型中执行after_save :update_counts
:
CommentVote
,您将这样称呼它:def update_counts
self.comment.upvote = self.comment.comment_votes.upvote.count
self.comment.downvote = self.comment.comment_votes.downvote.count
self.comment.save
end