gem devise, как добавить комментарий к электронной почте пользователя? - PullRequest
1 голос
/ 14 июля 2020

Я использую gem devise для создания профиля пользователя. Каждый пользователь может создавать комментарии. Мне нужно добавить имя пользователя рядом с каждым комментарием примерно так: <%= @comment.user.name %>

в user.rb

  has_many :comments, dependent: :destroy 

в comment.rb

  belongs_to :users

в комментарии контроллер

before_action :find_comment ,only:[:show,:update,:edit,:destroy]

   def new
    @user =User.find(params[:id])
    @comment = @user.comments.build
  end

  def create
    @user =User.find(params[:id])
    @comment = @user.comments.build(comment_params)
    @comment.user = current_user
    if @comment.save
      redirect_to doctor_path(:id => @user.id)
    end
  end

private

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

  def comment_params
    params.require(:comment).permit(:text)
  end

пользовательский контроллер

  def show
    @user = User.find(params[:id])
  end

пользовательское шоу. html .erb

<% for item in @user.comments %>
  <% if item.text.present? %>
    <%= item.text %><br>        
    <%= @comment.user.name %>
    <br><hr>
  <% end %>

Я получил эту ошибку

undefined method `user' for nil:NilClass

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы можете сделать это наоборот, в своем методе show:

@comments = Comment.all

в вашем show представлении:

<% @comments.each do |comment| %>
  <%= comment.text %>
  <%= comment.user.name %>
<% end %>

Поскольку ваш вопрос не совсем ясен, я уточню, что если вы хотите отображать только комментарии, оставленные пользователем:

def show
  user_id = User.find(params[:id]).id
  @comments = Comment.where(user_id: user_id)
end
0 голосов
/ 16 июля 2020

Просто несколько быстрых правил для начала.

  1. У пользователя много комментариев, это будет связь между пользователем и комментарием, который он оставил. У вас уже есть это

  2. У пользователя много комментариев в профиле, это связь между пользователем и комментариями, оставленными для этого пользователя в его профиле

Теперь у вас есть это различие, которое начинает проясняться.

Начните с создания единой таблицы внешних ссылок, которая будет go между пользователями и комментариями, оставленными для профиля, и вызовом it profile_comments этой profile_comments таблице требуются user_id и comment_id целого типа для хранения первичных ключей из таблиц пользователей и комментариев, где user_id - это идентификатор пользователя, у которого оставлен комментарий о них в их профиле

Теперь вы можете настроить модель profile_comment со следующими отношениями

belongs_to comment
belongs_to user

Итак, теперь вам нужно изменить отношения вашей модели пользователя на следующие

user.rb

  has_many :comments
  has_many :profile_comments, dependent: :destroy

comment.rb

  belongs_to :user #not users as you have defined in your question
  has_many :profile_comments, dependent: :destroy

, а новой модели profile_comment.rb нужны два предложения belongs_to для комментария и user

profile_comment.rb

belongs_to :user
belongs_to :comment

Теперь, когда вы создаете комментарий, который необходимо назначить пользователю, а также profile_comment

Итак, теперь ваш контроллер комментариев должен настроить эти отношения, чтобы вместо

before_action :find_comment ,only:[:show,:update,:edit,:destroy]

   def new
    @user =User.find(params[:id])
    @comment = @user.comments.build
  end

  def create
    @user =User.find(params[:id])
    @comment = @user.comments.build(comment_params)
    @comment.user = current_user
    if @comment.save
      redirect_to doctor_path(:id => @user.id)
    end
  end 

Вам нужно что-то вроде этого

  def create
    @user =User.find(params[:id])
    @comment = current_user.comments.build(comment_params)
    @profile_comment = ProfileComment.new
    @user.profile_comment < @profile_comment
    @comment.profile_comment < @profile_comment
    if @comment.save
      redirect_to doctor_path(:id => @user.id)
    end
  end 

Ваше действие обновления также должно измениться соответствующим образом

Теперь в вашем представлении вместо

<% for item in @user.comments %>
  <% if item.text.present? %>
    <%= item.text %><br>        
    <%= @comment.user.name %>
    <br><hr>
  <% end %>
<% end %>

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

<% @user.profile_comments.each do | profile_comment |%>
  <%comment = profile_comment.comment%>
  <% if comment.text.present? %>
    <%= comment.text %><br>
    <%if comment.user.blank?%>
      No user assigned to this comment
    <%else%>
      <%= comment.user.name #or email or whatever%>
    <%end%>
    <br><hr>
  <% end %>
<% end %>

Хотя текст является зарезервированным словом и является фактическим типом столбца, поэтому вы можете хотите изменить текст имени столбца на что-то другое

Любые вопросы по этому поводу не стесняйтесь возвращаться ко мне, но меня не будет в ближайшие 24 часа. Надеюсь, это ясно и поможет вам понять, что пошло не так с вашей начальной настройкой

В контроллере и представлении я предположил, что current_user - это человек, делающий комментарий, а @user - это человек, который комментируется. Просто переключи этот раунд, если я ошибаюсь

...