У меня возникла проблема, когда 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
.
Спасибо за руководство.