rails enum 同じ文字の定義

enumでその他という項目をそれぞれのenumに用意したところ、

which is already defined by another enum

 

というエラーが出てしまった

 

https://www.tom08.net/entry/2016/11/09/141349

 

このサイトに書いてある通りに修正

grade:{"1年":1,"2年":2,"3年":3,"4年":4,"M1":5,"M2":6,"その他":7}, _suffix: true

enumの最後にを

, _suffix: true

つけた

 

無事エラー解決されて動いた

rails devise カラム追加

sign_upするときにdeviseのデフォルト以外に新しいカラムを作りたかった

https://ruby-rails.hatenadiary.com/entry/20140804/1407168000

を参考にした

かなり順調に言ったかと思いきや

Unpermitted parametersが出た場合は、"Strong Parameter"のエラー

がでた、記事通りにやったらまた別のエラー

https://qiita.com/ry023/items/c6a469f65615f796be45

この記事通りに修正したらうまくいった

どうやら

devise_parameter_sanitizer.for

は古いらしい

includeとprependの違い

Module#ancestors

というメソッドを使ってみる

このメソッドはクラス、モジュールのスーパークラスとインクルードしているモジュール を優先順位順に配列に格納して返すメソッド

https://docs.ruby-lang.org/ja/latest/method/Module/i/ancestors.html

使い方としてはこんな感じ

p Integer.ancestors
# => [Integer, Numeric, Comparable, Object, Kernel, BasicObject]

になる

https://qiita.com/pink_bangbi/items/2c2f17516cd3a7b4eeac

 

Ex1

ファイル名:practice_main.rb

require './practice'
require './practice2'

Practice2.lala

p2 = Practice2.new
p2.mama
p2.papa
p Practice2.ancestors

ファイル名:practice.rb

class Haha
  class << self
    def lala
      puts "クラスタンスメソッド"
    end
  end
end

ファイル名:practice2.rb

require "./fur"
require "./claw"

class Practice2 < Haha 
include Fur
  include Claw

  def papa
    puts "Practice2クラスのhaha"
  end
end

ファイル名:fur.rb

module Fur
  def papa
    puts "fur_moduleのなかのpapaメソッド"
  end
end

ファイル名:claw.rb

module Claw
  def mama
    puts "practice.rbののpapaメソッドを置き換えた"
  end
end

 

 

Ex2

require './practice'
require './practice2'

Practice2.lala

p2 = Practice2.new
p2.mama
p2.papa
p Practice2.ancestors

ファイル名:practice.rb

class Haha
  class << self
    def lala
      puts "クラスタンスメソッド"
    end
  end
end

ファイル名:practice2.rb

require "./fur"
require "./claw"

class Practice2 < Haha
  prepend Fur
  prepend Claw

  def papa
    puts "Practice2クラスのhaha"
  end
end

ファイル名:fur.rb

module Fur
  def papa
    puts "fur_moduleのなかのpapaメソッド"
  end
end

ファイル名:claw.rb

module Claw
  def mama
    puts "practice.rbののpapaメソッドを置き換えた"
  end
end

こう2つのコードを書いた

 

Ex1の方は

$ ruby practice_main.rb

クラスタンスメソッド

practice.rbののpapaメソッドを置き換えた

Practice2クラスのhaha

[Practice2, Claw, Fur, Haha, Object, Kernel, BasicObject]

 

と出力された

 

Ex2の方は

$ ruby practice_main.rb

クラスタンスメソッド

practice.rbののpapaメソッドを置き換えた

fur_moduleのなかのpapaメソッド

[Claw, Fur, Practice2, Haha, Object, Kernel, BasicObject]

 

と出力された

 

見ての通り上書きの順番が異なっているため、実行結果に変化が生じた

 

moduleの組み込み前回のつずき

https://qiita.com/go8/items/db936ff7312ba7d97315#%E8%A4%87%E6%95%B0%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%ABinclude%E7%B7%A8

このサイトを参考に試してみる

moduleを組み込む前回の復習

ファイル名:practice_main.rb

require './practice'
require './practice2'

Practice2.lala

p2 = Practice2.new
p2.mama
p2.papa

ファイル名:practice.rb

class Haha
  class << self
    def lala
      puts "クラスタンスメソッド"
    end
  end
end

ファイル名:practice2.rb

require "./fur"
require "./claw"

class Practice2 < Haha
  include Fur
  include Claw
end

ファイル名:fur.rb

module Fur
  def papa
    puts "fur_moduleのなかのpapaメソッド"
  end
end

ファイル名:claw.rb

module Claw
  def mama
    puts "practice.rbののpapaメソッドを置き換えた"
  end
end

このコードで実行すると

ruby practice_main.rb

クラスタンスメソッド

practice.rbののpapaメソッドを置き換えた

fur_moduleのなかのpapaメソッド

 

このように出力された

requireで取得したものの上書きまでできてる

moduleの組み込み

https://qiita.com/go8/items/db936ff7312ba7d97315#%E8%A4%87%E6%95%B0%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%ABprepend%E7%B7%A8

このサイトを参考に試してみる

moduleを組み込む

ファイル名:practice_main.rb

require './practice'
require './practice2'

Practice2.lala
Practice2.new.mama

ファイル名:practice.rb

class Haha
  class << self
    def lala
      puts "クラスタンスメソッド"
    end
  end

  def mama
    puts "インスタンスメソッド"
  end
end

ファイル名:practice2.rb

class Practice2 < Haha
  def mama
    puts "継承メソッド"
  end
end

ファイル名:fur.rb

module Fur
  def papa
    puts "fur_moduleのなかのpapaメソッド"
  end
end

このコードで実行すると

$ ruby practice_main.rb

クラスタンスメソッド

継承メソッド

fur_moduleのなかのpapaメソッド

 

このように出力された

クラス継承 オーバーライト

https://qiita.com/go8/items/db936ff7312ba7d97315

このサイトを参考に試してみる

前回のクラス継承の続き

ファイル名:practice_main.rb

require './practice'
require './practice2'

Practice2.lala
Practice2.new.mama

ファイル名:practice.rb

class Haha
  class << self
    def lala
      puts "クラスタンスメソッド"
    end
  end

  def mama
    puts "インスタンスメソッド"
  end
end

ファイル名:practice2.rb

class Practice2 < Haha
  def mama
    puts "継承メソッド"
  end
end

このコードで実行すると

$ ruby practice_main.rb

クラスタンスメソッド

継承メソッド

 

が出力され、無事オーバーライトできた