アラフォーがお金持ちになるためプログラマ目指すブログ

お金も根性も学歴もないアラフォーまきのがエンジニア…じゃない、プログラマになってお金持ち目指すよ!

【Railsメモ】formヘルパー 選択肢のデフォルト値

どうも、アラフォーまきのです。
前回の15回目の授業のときやったことがもう一つあったのだけど書き忘れていたので、メモですw

form_withを使って公開・非公開の選択肢を書いたけれど、そこでデフォ値を指定するには?

選択肢のデフォ値を決めたかった

公開・非公開の選択肢で、基本は非公開をデフォルト表示にしたい。

何も指定していない場合は、HTML的には一番先頭にあるものが選択される。

だからそれを考慮して公開・非公開の順番を書くだけでいいんだけれど、私それ知らなかったのと、順番のことなんて考えもせず適当に書いちゃって「あぁ…」となった。

さあこの場合はどうする?

答えは案外簡単で、14回目の授業の時に指定した定数を使って、デフォ値を設定してみちゃうだけだった。

www.arafo-enjineer.net

公開・非公開に限らず他でも応用できる。
というか、超基本?
教わったとき「あー!そうか!」ってなったw

やりかた

1:公開・非公開をどう設定したか確認

app/lib/Constants.rb

class Constants

    PUBLIC = 1
    PRIVATE = 0

    def self.options_for_public
        [['公開', PUBLIC], ['非公開', PRIVATE]]
    end
end

この間の授業で、ビューの部品を作るため自分でappの直下に新しいlibフォルダを作ったんでした。

そこで上記のようなコードを書いたんでしたね。

PUBLICという定数を何かに代入すれば、代入されたそれはPUBLIC = 公開となるという状況。

逆にPRIVATEという定数を代入すれば、非公開ということに。

2:選択肢のコードを確認

work/new.html.erb

  <%= form.select :public, options_for_public, selected: @work.public %>

  <%= form.select :pick_up, options_for_public, selected: @work.pick_up %>

form.select :publicform.select :pick_uppublicpick_upは、
「今回の選択肢の対象は:publicカラムや:pick_upカラムだよー」ってことでした。

んで、selectedで@work.public@work.pick_upを指定してる。
つまり、今指定しているworkのpublicが持ってる値を表示するよ、と。

editなら、前回選択した値がここに入っているわけだ。
非公開で登録したなら非公開が、公開で登録したなら公開が選択された状態でここが表示される。

けど、newのときは?今選択肢決めるじゃん。

それが、冒頭で出てきた「何も指定していない場合は、HTML的には一番先頭にあるものが選択される。」につながる。

まだ選択してなくて、これから選択肢を選んでもらうわけなので、HTML的には一番先頭にあるものが選択され、表示されるわけだ。

本当は非公開をデフォにしたいけれど、私は考えなしにコード書いたから、公開がデフォで表示されちゃう状態。

3:定数をこの@work.publicと@work.pick_upに代入してやればOK

さっきのnewが関係するコントローラのnewアクションに代入するコードを書くだけでよかったw

work_controller.rb

def new
  ー省略ー
  @work = Work.new
  @work.public = Constants::PRIVATE
  @work.pick_up = Constants::PRIVATE
end

これだけだった。

これで…

selectedには@work.publicが入った

@work.publicにはConstants::PRIVATEが入った

Constantsクラスで、PRIVATEという定数は非公開にした

selected = @work.public = PRIVATE = 非公開

とつながる。

Constants::PRIVATEという風に、クラスと定数の間に【::】が挟まっているわけだけど、これはオブジェクト名.メソッド名と同じ。

「Constantsクラスの、定数”PRIVATE”をお呼び出しいたします」という意味。

Rubyずっとやってなくてすっかり忘れてた。

厳密には違うのかもだけど、今はとりあえずそういうことでw
また復習します。

Ruby on Railsなのに、Ruby書いてる感じ全然なくって、Ruby on Railsという一つの言語っぽい感覚。

HTML、JavaScript、Rails…いろんな言語が使われるもんね。
なんだかそういう新しい言語みたいでw

書いてる内容、とりあえず動きはするけれど、スマートじゃなかったり、語弊があることもあると思いますが、そのときは教えてやってください。

さあ、今日もドライゼロ飲んでで頑張りますw
(ノンアルならドライゼロが一番うまいよね)

アサヒ ドライゼロ ノンアルコール 350ml×24本

アサヒ ドライゼロ ノンアルコール 350ml×24本