Не удалось найти пользователя без идентификатора, уведомителя - PullRequest
1 голос
/ 27 февраля 2020

Я делаю простую отправку писем с сообщением и темой, когда я хочу отправить почту на почту назначения, я получаю следующую ошибку: «Не удалось найти пользователя без идентификатора»

У меня есть следующий код:

app / mailers / notifier.rb:

def envio_mail(subject, message, user)
  @user = User.find(user)
  @muser = user
  @body_message = message
  mail(:to => @user.email, :subject => subject)
end

app / controllers / grattitude_controller.rb:

def create
  @gratitude = Gratitude.new(params[:gratitude])

  user = params[:user_id]
  Notifier.envio_mail(params[:subject], params[:message], user).deliver

  respond_to do |format|
    if @gratitude.save
      format.html { redirect_to(@gratitude, :notice => 'Gratitude was successfully created.') }
      format.xml  { render :xml => @gratitude, :status => :created, :location => @gratitude }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @gratitude.errors, :status => :unprocessable_entity }
    end
  end
end

Это ошибка:

Started POST "/gratitudes" for 127.0.0.1 at 2020-02-26 17:10:55 -0500
Processing by GratitudesController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"iofCtlwd5CE5Zbuo5n6NzCo4Inksht4o05OiiwYUY24=", "gratitude"=>{"subject"=>"asdasd", "message"=>"<p>asda</p>", "user_id"=>"4"}, "commit"=>"Enviar mensaje"}
      SCHEMA (0.6ms)  SHOW TABLES 
      ClientParameterization Load (0.2ms)  SELECT `client_parameterizations`.* FROM `client_parameterizations` LIMIT 1
      User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
      Profile Load (0.2ms)  SELECT `profiles`.* FROM `profiles` WHERE `profiles`.`id` = 1 LIMIT 1
    Completed 404 Not Found in 130ms

    ActiveRecord::RecordNotFound (Couldn't find User without an ID):
      app/mailers/notifier.rb:405:in `envio_mail'
      app/controllers/gratitudes_controller.rb:48:in `create'

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

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

 def create
  @gratitude = Gratitude.new(gratitude_params)
  respond_to do |format|
    if @gratitude.save
      Notifier.envio_mail(@gratitude.subject, @gratitude.message, @gratitude.user).deliver
      format.html { redirect_to(@gratitude, notice: 'Gratitude was successfully created.') }
      format.xml  { render xml: @gratitude, status: :created, location: @gratitude }
    else
      format.html { render :new }
      format.xml  { render xml: @gratitude.errors, status: :unprocessable_entity }
    end
  end
end

# ...

private

def gratitude_params
  params.require(:gratitude)
        .permit(:subject, :message, :user_id)
end

Это предполагает, что в вашей модели Gratitude есть какие-то проверки, которые проверяют наличие user_id, subject и message.

1 голос
/ 27 февраля 2020

В ваших параметрах "gratitude"=>{"subject"=>"asdasd", "message"=>"<p>asda</p>", "user_id"=>"4"}

user_id вложено в gratitude, сделайте это, чтобы получить user_id

user = params[:gratitude][:user_id]

Предложение

Чтобы убедиться, что письмо отправляется только после успешного создания Gratitude, вы можете переместить триггер почты на after_commit обратный вызов в Gratitude модель

в модели Gratitude

after_commit :send_mail, on: :create

def send_mail
  Notifier.envio_mail(subject, message, user_id).deliver
end

Надеюсь, это поможет!

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