LoginSignup
1
1

More than 5 years have passed since last update.

RailsでのServiceの使い方2

Last updated at Posted at 2016-08-24

Implement in Controller

bash
vi app/controllers/bank_accounts_controller.rb
bank_accounts_controller.rb
def transfer_money
  from = BankAccount.find 1
  to = BankAccount.find 2
  BankAccount.transaction do
    to.money += from.money
    from.money = 0
    from.save!
    to.save!
  end

  render text: 'success'
end

Implement in Model

vi app/controllers/bank_accounts_controller.rb
bank_accounts_controller.rb
def transfer_money
  BankAccount.transfer_money(1, 2)

  render text: 'success'
end
bash
vi app/models/bank_account.rb
app/models/bank_account.rb
class BankAccount < ActiveRecord::Base
  class << self
    def transfer_money(f, t)
      from = BankAccount.find f
      to = BankAccount.find t
      self.transaction do
        to.money += from.money
        from.money = 0
        from.save!
        to.save!
      end
    end
  end
end

Implement in Service

bash
mkdir app/services
bash
vi config/application.rb 

Add this line.
It might not need it.
You can check like this.

irb
puts ActiveSupport::Dependencies.autoload_paths
application.rb
config.autoload_paths += %W(#{config.root}/app/services)

restart rails

bash
rails s -b 0.0.0.0
bash
vi app/services/bank_account_transfer_service.rb
bank_account_transfer_service.rb
class BankAccountTransferService
  def initialize(f, t)
    @from = BankAccount.find f
    @to = BankAccount.find t
  end

  def transfer_money
    BankAccount.transaction do
      @to.money += @from.money
      @from.money = 0
      @from.save!
      @to.save!
    end
  end
end
bash
vi app/controllers/bank_accounts_controller.rb
bank_accounts_controller.rb
def transfer_money
  bat_service = BankAccountTransferService.new(1,2)
  bat_service.transfer_money

  render text: 'success'
end
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1