Posted at

Railsのフォームについて


初めに

Railsのフォームについて忘備録としてまとめます。


form_with

まえはform_tagとかform_forとかあったが今はform_withがスタンダードらしい

form_withの場合モデルに関連するもの、関連しないものどちらも扱えるのでよい

書き方はform_forとほとんど同じなはず


基本的な形

基本的な形はこんな感じ

<%= form_with @user do |f| %>

<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :age %>
<%= f.number_field :age %>
<%= f.submit %>
<% end %>


urlを指定

urlを指定したい場合は

<%= form_with url: new_user_path do |f| %>

こうする。


ちなみに

こんなこともできる

<%= form_with model: User.new do |f| %>

とか

<%= form_with model: User.first do |f| %>

この場合はUser.firstをアップデートするときに使う


フォームをネストさせる

フォームをネストさせたい場合

例えばuserモデルとpostモデルがあるとして

user と postが一対多であるときは

モデルファイルに


user.rb

has_many :posts

accepts_nested_attributes_for :posts


post.rb

belongs_to :user


とかいたら準備完了。

フォームに

<%= form_with @user do |f| %>

<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :age %>
<%= f.number_field :age %>
<%= f.fields_for :posts do |m| %>
<%= m.label :body %>
<%= m.text_area :body %>
<% end %>
<%= f.submit %>
<% end %>

みたいな感じで使える


form_withでのセレクトボタンやラジオボタン、チェックボックス

まずチェックボックスについて

<%= f.check_box :admin %>

みたいな感じで行う

この場合:adminはboolean型でなければうまくいかない

次にラジオボタン

<label><%= f.radio_button :feeling, "fun" %>fun</label>

<label><%= f.radio_button :feeling, "soso" %>soso</label>
<label><%= f.radio_button :feeling, "not fun" %>not fun</label>

みたいにできる。

最後にセレクトボタン

<%= f.select :feeling, [["fun","fun"],["soso","soso"],["not fun","not fun"]] %>

こんな感じ


おまけ

最近enum?についての記事を見た

今まで使ったことなかったけどよさそうなので使ってみる。

使い方は簡単で例えばpostモデルにsecret,frends_only,everyone_allowっていうstatusを作るとしたら(英語がよくわからんからそこは許して....)

postにstatusというカラムをintegerで追加して

models/post.rbに

enum status: {secret: 0, frends_only: 1, all_people: 2}

と書いて終わり

フォームに

<%= m.select :status, Post.statuses.keys.to_a, {} %>

と書いたらそれでセレクトボタンを作ってくれる

値はpost.statusで数字ではなくsecretなどの文字を返してくれる。

便利!

多分二つのstatusならbooleanでいいけど三つ以上ならenumつかうとよい感じ:sunny:

おわり。