Как разрешить гостевым пользователям комментировать платформу, когда есть отношение own_to - PullRequest
1 голос
/ 01 августа 2020

Я изучаю Rails 6, реализующий блог, и я хочу, чтобы пользователи могли комментировать сообщение, даже если они не являются пользователями платформы.

Я не уверен, как это сделать, потому что в настоящее время Я создаю такой комментарий

  def create
    @comment = Comment.new(
      guest_user: params[:guest_user],
      post_id: params[:post_id],
      user_id: current_user.id,
    )
   ...

  end

и комментарии belong_to User.

Я создал модель GuestUser, чтобы использовать ее в качестве заполнителя, но я не уверен что делать с id

class GuestUser < User
  attr_accessor :name, :first_name, :last_name, :email
end

Как вы думаете, какой подход для этого лучше всего подходит?

1 Ответ

2 голосов
/ 01 августа 2020

Есть несколько разных способов, я думаю, вы могли бы это сделать, вот один из возможных. Скажем, ваша форма комментария выглядела примерно так (множество предположений приведено ниже, но должно быть не так уж плохо, чтобы изменить это в соответствии с вашими потребностями):

= simple_form_for :comment do |f|
  = f.input :comment_body # Not sure what your comment model looks like here, just a guess
  - unless current_user.present? # Don't show the GuestUser fields unless no current_user, will also validate this on the backend
    = f.input :first_name
    = f.input :last_name
    = f.input :email
  # ...

В вашем контроллере вы можете что-то сделать например:

  def create
    user = current_user || GuestUser.create(guest_params) # Take the current logged in user, or generate a new GuestUser
    redirect_to(#bad_user_path, notice: 'User invalid') unless user.valid? # Mostly a check on GuestUser here

    @comment = user.comments.new(comment_params)

    if @comment.save!
      redirect_to (#wherever), notice: 'Saved comment!'
    else
      redirect_to (#wherever), notice: 'Comment invalid'
    end
  end

  private

  def comment_params
    params.require(:comment).permit(:comment_body)
  end
  
  def guest_params
    params.require(:comment).permit(:first_name, :last_name, :email)
  end
end

Опять же, здесь будет несколько предположений, например, что ваша модель Comment содержит некоторые attr_accessor s для :first_name, :last_name, :email, просто чтобы вы могли использовать f.input в простом форма vs f.text_field, но это будет один путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...