Параметр POST, кажется, устанавливается в 0, таким образом выдает ошибку - PullRequest
0 голосов
/ 16 мая 2018

У меня возникла проблема, когда subscriber[:job_id] сначала корректно, но затем устанавливается на 0.

#controllers/subscribers_controller.rb
class SubscribersController < ApplicationController

  def create
    @subscriber = Subscriber.new(subscriber_params)
    puts subscriber_params #THIS OUTPUTS {"job_id"=>"EtcaA1a1p00J", "email"=>"test@test.com"}
    puts @subscriber #THIS OUTPUTS <Subscriber:0x007fa36c88c658>  
    puts @subscriber.job_id #THIS OUTPUTS 0
    puts @subscriber.email #THIS OUTPUTS test@test.com
    @job_id = subscriber_params[:job_id]
    result = NewSubscriptionService.(subscriber: @subscriber, job_id: @job_id)
    if result.success?
      redirect_to result.job, success: 'You will be notified of changes to this job.'
    else
      redirect_to result.job, alert: 'Sorry, we were not able to subscribe you to this job.'
    end
  end

  def subscriber_params
    params.require(:subscriber).permit(:job_id, :email)
  end

end

Какие выходы:

#console output
app/controllers/subscribers_controller.rb:6:in `create'
Started POST "/subscribers/create" for 127.0.0.1 at 2018-05-16 10:28:08 -0600
Processing by SubscribersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"zAj1bFJSrxkngxlybsib7/S7b+xAXouuXonujnFSELQkk3j3akG5rhnzK0g2URR/P3Z5v33KCIjOWiwi3A8F0w==", "subscriber"=>{"job_id"=>"EtcaA1a1p00J", "email"=>"test@test.com"}, "commit"=>"Watch this job"}
   (0.2ms)  BEGIN
  SQL (1.0ms)  INSERT INTO "subscribers" ("job_id", "email", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["job_id", 0], ["email", "test@test.com"], ["created_at", "2018-05-16 16:28:08.523325"], ["updated_at", "2018-05-16 16:28:08.523325"]]
   (0.1ms)  ROLLBACK
Completed 500 Internal Server Error in 63ms (ActiveRecord: 6.3ms)



ActiveRecord::InvalidForeignKey (PG::ForeignKeyViolation: ERROR:  insert or update on table "subscribers" violates foreign key constraint "fk_rails_2090f82b35"
DETAIL:  Key (job_id)=(0) is not present in table "jobs".
: INSERT INTO "subscribers" ("job_id", "email", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"):

app/services/new_subscription_service.rb:14:in `perform'
app/services/new_subscription_service.rb:10:in `call'
app/controllers/subscribers_controller.rb:6:in `create'

Параметры передаются объекту службы:

#services/new_subscription_service.rb
class NewSubscriptionService

  def initialize(params)
    @subscriber = params[:subscriber]
    puts params[:subscriber] #THIS OUTPUTS <Subscriber:0x007fa36c88c658>  
    puts params[:subscriber][:job_id] #THIS OUTPUTS 0
    puts @subscriber.job_id #THIS OUTPUTS 0
    @job_id = params[:job_id]
    @job = Job.find_by(hash_id: @job_id)
  end

  def self.call(params)
    new(params).perform
  end

  def perform   
    if subscriber.save
      OpenStruct.new(success?: true, subscriber: subscriber, job: job, error: nil)
    else
      OpenStruct.new(success?: false, subscriber: subscriber, job: job, error: subscriber.errors)
    end
  end

  private

    attr_reader :job_id, :job, :subscriber

end

Я что-то не так делаю в NewSubscriptionService, что вызывает изменение job_id? email выживает каждый раз, поэтому я не уверен, что происходит с job_id.

Спасибо за руководство.

1 Ответ

0 голосов
/ 17 мая 2018

Когда вы вызываете NewSubscriptionService.new в вашем контроллере, вы передаете 2 параметра.
Просто измените метод initialize вашего сервиса с этими параметрами:

#controller
result = NewSubscriptionService.new(@subscriber, @job_id)

# service
def initialize(subscriber, job_id)
  @subscriber = subscriber
  @job_id = job_id
  @job = Job.find_by(hash_id: @job_id)
end

edit : кстати, если вы хотите сохранить хеш, то передайте хеш, а не 2 параметра

NewSubscriptionService.({ subscriber: @subscriber, job_id: @job_id })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...