感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

form_tagを使って送信フォームを作ってみる。

スポンサーリンク

Railsのメモ。

View

Viewのソースは以下のように書く。
form_tagメソッドは、前提となるモデルが存在しない時、つまり、モデルの編集目的でないときに、汎用的なフォームを生成するために利用する。

<h2>Form Example</h2>
<%= @msg %>
<hr/>
<%=form_tag({ :controller => 'samples', :action => 'hoge' },
  { :method => :post, :id => 'sample'}) do %>
  <%= text_field_tag :text1, '', { :size => 25 } %>
  <%= submit_tag '送信' %>
<% end %>

Controller

上のViewのところでは、Controller => 'samples'として、その中のどのアクションを実行するかを、
action => 'hoge'で指定した。
Controllerのdef hogeメソッドが実行される。

#coding: utf-8
require 'kconv'

class SamplesController < ApplicationController

  def hoge
    if request.post? then
      @msg = "typed:" + params['text1']
    else
      @msg = "please write some word"
    end
  end
end

実際にブラウザで見てみると、

typed:test

のように、入力した文字が表示される。


以下のようなエラーが出たら、日本語をコードに含んでいるパターンを疑ったほうがいいかもしれない。

We're sorry, but something went wrong

フォームを作るときに、以下のようなエラーが出た場合は、モデルにインスタンスが作られていないことを疑うとよい。

undefined method `model_name' for NilClass:Class

自分の場合は、

  def hoge
    @books = Book.all
    @book = Book.new
  end

みたいに書くことで、上記のエラーを回避できた。
allメソッドはテーブルからすべてのデータを取得するもので、テーブルの中身を無条件に取り出す場合に利用する。

その他、inputとかtextareaとか、いろいろな要素を生成できる。
xxxx_field,text_area,radio_button,check_boxメソッドなどがある。

# coding: utf-8
<h2>Form Example</h2>

<%= form_for(@book) do |f| %>
  テキストボックス:
  <%= f.text_field :isbn,
    { :size => 20, :maxlength => 25, :read_only => true } %><br/>

  ラジオボタン:
  <label><%= f.radio_button :publish, 'gihyo', { :class => 'rd' } %>
    技術評論社</label>
  <label><%= f.radio_button :publish, 'shoei' , { :class => 'rd' } %>
    翔泳社</label>
  <label><%= f.radio_button :publish, 'mycomi' , { :class => 'rd' } %>
    マイコミ </label><br/>

  チェックボックス:
  <label><%= f.check_box :cd, { :class => 'chk' }, 'yes', 'no' %>
    isOK?</lable></br>

  電話番号:
  <%= f.telephone_field :isbn,
    { :size => 10, :maxlength => 15 } %><br/>

<% end %>

画面のキャプチャを見せたいところだけれど、使ったwindowsが壊れて、代わりにmacを使っていて、macのキャプチャソフトがよくわからんので載せられない。
しかし、ちゃんと動いているよ。

<参考文献>
Ruby on Rails 3 アプリケーションプログラミング