RoR-如何在视图上进行.each循环将变量传递给控制器

时间:2018-10-02 10:47:36

标签: ruby-on-rails ruby

我正在尝试在博客应用程序的评论中添加投票。但我似乎无法将以下循环内的变量发送给控制器:

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'):

3 个答案:

答案 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); } } 保存用户对注释的操作,例如,模型属于CommentVoteuser

然后您需要执行以下操作:

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