RoR - как сделать так, чтобы цикл .each на представлениях передавал переменную в контроллер - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь добавить голоса к комментариям в моем приложении блога.Но я не могу отправить переменную в цикле ниже на контроллер:

<% @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
....

Маршруты:

Rails.application.routes.draw do
 .... 
  #Comments
  post    '/post/:post_id',                                  to: 'comment#create',    as: 'new_comments'
  get     '/post/:post_id/:comment_id/edit',                 to: 'comment#edit',      as: 'edit_comment'
  put     '/post/:post_id/comment/:comment_id',              to: 'comment#update',    as: 'update_comment'
  delete  '/post/:id/:comment_id/',                          to: 'comment#destroy',   as: 'delete_comment'
  put     'like',                       to: "comment#upvote",    as: 'like'
  put     'dislike',                                         to: "comment#downvote",  as: 'dislike'


end

Я хотел бы получить 'c', указанный в каждом цикле, как переменную в методах upvote и downvote, чтобы заменить @comment в object_comment = Comment.find (@ comment.id), чтобы увеличить число голосов.Это возможно?

Как правильно, я, очевидно, получаю следующую ошибку:

NoMethodError (неопределенный метод "id" для nil: NilClass):

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Ваши *_path методы не знают, что делать с этим единственным аргументом.(Если вы хотите передать объект своим ссылкам, вы можете исследовать RESTful-маршрутизацию. Однако, чтобы решить его с вашими текущими маршрутами, я предлагаю

<%= link_to "Downvote #{c.downvote}" dislike_path(id: c.id) %>

После этого появится возможность доступа к этому *Атрибут 1005 * в контроллере через params.

def dislike
  @comment = Comment.find(params[:id])
  ...
end

Подумайте еще о нескольких вещах:

Выполнение действия put при нажатии очень необычноссылка. Возможно, вы захотите сделать это как действие get.

Возвращает ли метод downvote что-то различное для каждого комментария? Если нет, то это стандартная практика включать его впомощник диспетчера.

0 голосов
/ 02 октября 2018

Я думаю, вы делаете это неправильно.Вам нужно сохранить действие пользователя для комментария с моделью 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

, и вы назовете его следующим образом: CommentVote.vote(type: :upvote, comment_id: 1, user_id: 1)

0 голосов
/ 02 октября 2018

Вы можете получить идентификатор в параметрах, пожалуйста, проверьте ниже методы

def upvote

    object_comment = Comment.find(params[:id])
    object_comment.increment!(:upvote)
    redirect_to show_path(@post)

  end

  def downvote
    object_comment = Comment.find(params[:id])
    object_comment.increment!(:downvote)
    redirect_to show_path(@post)
  end
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...