Как извлечь электронную почту пользователя из комментария к записи в приложении на форуме rails? - PullRequest
0 голосов
/ 05 июля 2019

Мне нужно иметь возможность отображать электронную почту пользователя, который прокомментировал сообщение в моем приложении rails.

Я уже убедился, что все мои ассоциации верны, и внутри метода create я зарегистрировал current_user.email и @comment.user.email, которые оба возвращают правильные значения.Тем не менее, в частичном _comment я получаю сообщение об ошибке: nil.

Модели:

class Comment < ApplicationRecord
  belongs_to :post
  belongs_to :user
  validates :comment_text, presence: true
end

class Post < ApplicationRecord
  belongs_to :user
  has_many :comments, dependent: :destroy
  validates :title, presence: true
  validates :content, presence: true
end

class User < ApplicationRecord
  has_secure_password
  has_many :posts, dependent: :destroy
  has_many :comments, dependent: :destroy
  validates :email, presence: true, uniqueness: true
end 

Контроллер:

class CommentsController < ApplicationController
before_action :find_post, only: [:show, :create, :edit, :update, :destroy]

def index
    @comments = Comment.all.order('created_at ASC')
end

def show
end

def new
    @comment = Comment.new
end

def create
    @comment = @post.comments.create(comment_params)
    @comment.user_id = current_user.id
    @comment.user.email = current_user.email
    puts current_user.email
    puts @comment.user.email


    if @comment.save
        flash[:success] = 'Your comment has been added to the post'
        redirect_to post_path(@post)
    else
        flash.now[:error] = 'Something went wrong. Your comment was not added to the post'
        render 'new'
    end
end

def update
end

def edit
end

def destroy
end

private

def comment_params
    params.require(:comment).permit(:comment_text, :post)
end

def find_post
    @post = Post.find(params[:post_id])
end
end 

Частичное представление:

<p><%= comment.comment_text %></p>
<p><%= comment.user %></p>
<p><%= comment.user_id %></p>
<p><%= comment.user.email %>

Представление пост-шоу:

<div class="comment-div">
    <%= render @post.comments %>
</div>

Я ожидаю увидеть электронную почту комментатора, но вместо этого я получаю эту ошибку:

undefined method `email' for nil:NilClass
Extracted source (around line #4):
2
3
4

<p><%= comment.user %></p>
<p><%= comment.user_id %></p>
<p><%= comment.user.email %>

1 Ответ

0 голосов
/ 05 июля 2019

Начиная с рельсов 5, все belongs_to ассоциации обязательны, если не указано иное.Так как ваша модель комментария имеет belongs_to :user без необязательного ключа: belongs_to :user, optional: true, создание комментария не будет выполнено и произойдет откат, потому что это создаст несогласованность базы данных (у вас будет комментарий без какого-либо пользователя).

Чтобы исправить это, у вас есть несколько вариантов:

  1. Вместо непосредственного создания комментариев, создайте один (еще не сохранив его), а затем назначьте user_id:
   @comment = @post.comments.build(comment_params) # This won't save to the database yet so it won't have any inconsistencies 
   @comment.user_id = current_user.id
   @comment.user.email = current_user.email #This line is unnecessary, the email is already assigned through the user relation
   @comment.save

Второй вариант - добавить user_id к comment_params, чтобы в форме вы добавили скрытое поле, включающее user_id = current_user.id

Добавьте параметр optional: trueв отношении belongs_to в модели, однако я бы не рекомендовал это.

Если создание вашего комментария откатывается, вы можете проверить ошибку, выполнив @comment.errors

...