モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

フォーム関連の記述に役立つビューヘルパーの使い方 (Rails4)

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2014/06/16
最終更新最終更新
2017/01/12
記事区分記事区分
一般公開

目次

    サーバーレスとDevOpsに注力中。AWSを使った効率的なインフラ構築が得意です。

    他のMVCフレームワークと同様に、Rails4にも様々なビューヘルパーが用意されています。そのうち、ここでは特にフォーム関連のタグを生成するためのヘルパーの使用方法についてまとめてみます。

    事前準備

    ビューヘルパーのサンプルを実行するために、

    $ rails generate scaffold myModel field1:string field2:integer field3:date field4:boolean
    $ rake db:migrate
    

    を実行しておきましょう。また、サンプル実行時のエラー回避のために、ルーティングを一つ追記しておきましょう。

    config/routes.rb

    MyApp::Application.routes.draw do
      resources :my_models
    
      match ':controller(/:action(/:id))', via: [ :get, :post, :patch ] # ←追記
    ...
    

    簡単なサンプルコード

    1. モデルに依存しないデータのみをPOSTするフォーム

    form_tagヘルパーを使用します。フォーム内部では xxx_tagヘルパーを使用します。

    app/views/my_models/new.html.erb

    <%= form_tag({ controller: :main, action: :search }, id: :css_id, class: :css_class) do %>
    <%= text_field_tag :search_box, '', size: 50 %>
    <%= submit_tag '検索実行' %>
    <% end %>
    

    生成結果例

    <form accept-charset="UTF-8" action="/main/search" class="css_class" id="css_id" method="post">
      <div style="margin:0;padding:0;display:inline">
        <input name="utf8" type="hidden" value="&#x2713;" />
        <input name="authenticity_token" type="hidden" value="tjI9oVd9hfvuNsX7IaVIf0Hu4rjf3nr9/sbda6II3GQ=" />
      </div>
      <input id="search_box" name="search_box" size="50" type="text" value="" />
      <input name="commit" type="submit" value="検索実行" />
    </form>
    

    2. モデルに依存したデータを含んでPOSTするフォーム (依存しないデータもPOST可能)

    form_forヘルパーを使用します。フォーム内部では

    • モデルに依存するデータは、f.xxxヘルパー (valueには適宜自動で値が設定されます)
    • モデルに依存しないデータは、xxx_tagヘルパー

    を使用します。

    app/controllers/my_models_controller.rb

    # GET /my_models/new
    
    def new
      @my_model = MyModel.new
    end
    

    app/views/my_models/new.html.erb

    <%= form_for(@my_model) do |f| %>
      <%= f.label :field1 %>
      <%= f.text_field :field1, size: 30 %>
      備考:
      <%= text_field_tag :additional_info, '', size: 30 %>
      <%= f.submit %>
    <% end %>
    

    出力結果例

    <form accept-charset="UTF-8" action="/my_models" class="new_my_model" id="new_my_model" method="post">
      <div style="margin:0;padding:0;display:inline">
        <input name="utf8" type="hidden" value="&#x2713;" />
        <input name="authenticity_token" type="hidden" value="tjI9oVd9hfvuNsX7IaVIf0Hu4rjf3nr9/sbda6II3GQ=" />
      </div>
      <label for="my_model_field1">Field1</label>
      <input id="my_model_field1" name="my_model[field1]" size="30" type="text" />
      備考:
      <input id="additional_info" name="additional_info" size="30" type="text" value="" />
      <input name="commit" type="submit" value="Create My model" />
    </form>
    

    その他のフォームヘルパー

    app/controllers/my_models_controller.rb

    # GET /my_models/new
    
    def new
      @my_model = MyModel.new(field1: '次郎') # セレクタ等で既定値を与える方法の一つ
      @my_models = MyModel.select(:field1).distinct # SELECT DISTINCT field1 FROM my_models
    end
    

    app/views/my_models/new.html.erb

    <%= form_for(@my_model) do |f| %>
    
      <!-- テキストエリア -->
      <%= f.text_area :field1, cols: 20, rows: 2 %>
    
      <!-- パスワード -->
      <%= f.password_field :field1, size: 20, maxlength: 20 %>
    
      <!-- チェックボックス -->
      <%= f.check_box :field2, {class: 'html-class', checked: true}, 'yes', 'no' %>
      <!-- ← チェックされなかったらinput-hidden(自動生成)で'no'を返す -->
      <%= f.label :field2, '許可' %>
    
      <!-- ラジオボタン -->
      <label><%= f.radio_button :field3, '白', {checked: true} %>白</label>
      <label><%= f.radio_button :field3, '黒' %>黒</label>
    
      <!-- DBから自動生成するチェックボックス -->
      <%= f.collection_check_boxes(:field1, @my_models, :field1, :field1) %>
      <!-- @my_modelsはコントローラでSELECTしておいた変数 -->
      <!-- 最後二つの ":field1" はそれぞれ、valueおよびラベルテキストに表示する列を指定 -->
    
      <!-- DBから自動生成するラジオボタン -->
      <%= f.collection_radio_buttons(:field1, @my_models, :field1, :field1) %>
    
      <!-- Hidden -->
      <%= f.hidden_field :field1 %>
    
      <!-- ローカルファイル選択 -->
      <%= f.file_field :field1 %>
    
      <!-- HTML5 -->
      <%= f.range_field :field1, min: 0, max: 50 %>
      <%= f.number_field :field1, min: 1, max: 25, step: 1 %>
      <%= f.color_field :field1 %>
      <%= f.date_field :field1 %>
      <%= f.time_field :field1 %>
    
      <!-- 基本的なセレクト -->
      <%= f.select :field1, ['紅組', '白組'],
          { include_blank: '選択してください'}, class: 'html-class' %>
    
      <%= f.select :field1, {'紅組' => 1, '白組' => 2},
          { include_blank: '選択してください'}, class: 'html-class' %><!-- テキストとvalueを違えたい場合 -->
    
      <%= select_tag 'selector-id', options_for_select(
          {'小学校' => 1, '中学校' => 2, '高等学校' => 3}, 2) %><!-- モデルに依存しないセレクト -->
    
      <!-- リストボックス -->
      <%= f.select :field1, ['一郎', '次郎', '三郎', '四郎'], {}, multiple: true, size: 3 %>
      <%= select_tag 'selector-id', options_for_select(
          ['小学校', '中学校', '高等学校', '大学']), multiple: true, size: 3 %><!-- モデルに依存しないリストボックス -->
    
      <!-- DBから自動生成するセレクト -->
      <%= f.collection_select :field1, @my_models, :field1, :field1 %>
      <!-- @my_modelsはコントローラでSELECTしておいた変数 -->
      <!-- 最後二つの ":field1" はそれぞれ、valueおよびテキストに表示する列を指定 -->
      <%= select_tag 'selector-id', options_from_collection_for_select(
          @my_models, :field1, :field1, 'ここにdefaultを指定可能') %><!-- モデルに依存しないセレクト -->
    
      <!-- DBから自動生成するグループセレクト -->
      <%# f.grouped_collection_select :field1, @listA, :listB, :f1, :f2, :f3 %>
      <!-- 前提: -->
      <!-- "my_models":"listB" = N:1 -->
      <!-- listBのフィールドの一部: ":f1",":f2",":f3" -->
      <!-- ":f1": optgroupのlabelに指定される -->
      <!-- ":f2": optionのvalueに指定される -->
      <!-- ":f3": optionのテキストに指定される -->
      <!-- "listA"は複数の"listB"を持つ -->
      <!-- コントローラにて: @listA=ListA.all -->
      <%# select_tag 'selector-id',
          option_groups_from_collection_for_select(@listA, :listB, :f1, :f2, :f3) %>
          <!-- モデルに依存しないセレクト -->
    
      <!-- 日付および時刻セレクト -->
      <%= f.date_select :field3, use_month_numbers: true %>
      <%= f.time_select :field3  %>
    
      <!-- アソシエートされた別のモデルを更新するサブフォーム -->
      <%# field_set_tag 'サブフォーム' do %>
        <%# fields_for @my_model.modelC do |cf| %>
          <%# cf.label :f1 %>
          <%# cf.text_field :f1 %>
        <%# end %>
      <%# end %>
      <!-- 前提: -->
      <!-- "my_models":"modelC" = 1:1 -->
      <!-- 1:N の場合は「@my_model.modelCList.each do |modelC|」としてから "fields_for @modelC" とする -->
      <!-- modelCのフィールドの一部: ":f1" -->
      <!-- 結果: -->
      <!-- "name=modelC[f1]"のようなHTMLが生成される -->
      <!-- "name=my_model[field1]"と別のハッシュとしてコントローラで取得 -->
      <!-- → params.require(:modelC).permit(:f1) -->
    
      <!-- サブミット -->
      <%= f.submit '実行', data: {
          confirm: '実行してもよいですか?',
          disable_with: '処理中です...'} %>
    <% end %>
    
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    サーバーレスとDevOpsに注力中。AWSを使った効率的なインフラ構築が得意です。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事

      • レイアウトおよび部分テンプレートに関するまとめ (Rails4)
        レイアウトおよび部分テンプレートはどちらもテンプレート (*.html.erb) に共通の要素をまとめておき、任意のテンプレートから利用できるようにしておくための仕組みです。フッターやヘッダーといった大枠はレイアウト、小さなパーツは部分テンプレートというイメージで使い分けましょう。 レイアウトの使用方法 クラス毎に指定する方法と、アクション毎に指定する方法があります。 app/views/layo...
        taro三世taro三世9/21/2016に更新
        いいねアイコン画像0
      • Ruby コードスニペット (正規表現)
        sample.rb str = "001: This is a string." var1,var2 = 2,3 # 'EOS'とすると#{}による変数展開がなされない (%03dは展開される) doc = (<<"EOS" % var1) # 括弧は省略可。要は<<"EOS"の次の行からEOSまで。(参: <<-"EOS"とすると前に空白...
        だいふくうさぎだいふくうさぎ4/13/2018に更新
        いいねアイコン画像0
      • OAuthを用いずにTwitterに自動投稿する (回数制限あり, Selenium with Ruby)
        Seleniumを用いて、OAuthを用いずにTwitterに自動投稿するRubyスクリプトを記述してみます。連続で複数回実行すると、ボット判定としてキャプチャ認証が発生します。その認証までは通過できませんので悪しからず。また、Twitterの仕様変更次第ではDOMの構造が変化するため、下記サンプルは機能しなくなる恐れが有ります。 twitter_post.rb #!/usr/bin/ruby r...
      • Ruby における日本語のエンコーディング
        日本語を含めて多言語対応する際には、Asciiコード以外の文字コードセットが必要になります。日本語が主となる場合、よく使われる文字セットにはUnicode, Shift_JIS, EUC-JPがあります。このうち Unicode だけは特殊であり、世界中のあらゆる文字を収録しようとしていることから 1 文字を表現するために必要なバイト数が大きくなってしまっています。そのため Unicode のうち...
        だいふくうさぎだいふくうさぎ3/21/2017に更新
        いいねアイコン画像0
      • Rails3ビューテンプレートの基本的な使用方法 (Ruby)
        Railsでは、ERB (eRuby (テキストファイルにRubyスクリプトを埋込む書式の仕様) をRubyで実装したもの) を用いてHTML内にRubyスクリプトを埋込むことができます。 <% %> で囲むと出力されません (if-elseなど制御構文を記述します) <%= %> で囲むとエスケープ出力されます <%== %> で囲むとエスケープされずに...