Rails Form Examples

From Wiki
Jump to navigation Jump to search

Form for editing a single database row

app/views/study.html.erb:

<table border="0" class="s_data">
<%= form_for :study, @study, :id => @study.id do |f| %>
<tr><td class="v_header">Study Name:</td>
    <td><%= f.text_field :name, {:size => 15} %></td>
    <td class="formError"><%= @name_error %></td>
</tr>
<tr><td class="v_header">Default Account:</td>
    <td><%= f.text_field :account, {:size => 15} %></td>
    <td class="formError"><%= @account_error %></td>
</tr>
<tr><td>&nbsp;</td><td><%= submit_tag "Save" %></td></tr>
<% end %>
</table>

Controller

app/controllers/study_controller.rb:

def edit
    @user = User.find(session['user']['id'])
    @title = 'Edit Study'
    @study = Study.find(params['id'])
    if not @study or not can_edit(@user, @study.group)
        redirect_to :action => 'list'
        return
    end
    @name_error = ''
    @account_error = ''
    if params['study']
        name = params['study']['name'].strip
        if (not name) or name.size < 2 or name.size > 32
            @name_error = "Study name must contain between 2 and 32 characters"
        end
        account = params['study']['account'].strip.upcase
        if account.size > 0
            # verify account format
            if account =~ /^\w-\w{7}$/ or account =~ /^\w-\w{7}-\w{5}$/
                params['study']['account'] = account
            else
                @account_error = "Account number must take the form X-YYYYYYY or X-YYYYYYY-ZZZZZ"
            end
        else
            params['study']['account'] = nil
        end
        if @name_error.size + @account_error.size == 0
            if @study.update_attributes(params[:study])
                redirect_to :action => 'list'
            end
        end
    end
end

Form for generic POST

app/views/user/login.html.erb:

<% if flash['notice'] %>
    <h1 style="color: red;"><%= flash['notice'] %></h1>
<% end %>
<table border="0" class="s_data">
<% form_tag :action => 'verify' do %>
    <tr><td class="v_header">Email</td>
    <td><%= text_field 'user', 'email' %></td></tr>
    <tr><td class="v_header">Password</td>
    <td><%= password_field 'user', 'pass' %></td></tr>
    <tr><td>&nbsp;</td><td><%= submit_tag "Log in" %></td></tr>
<% end %>
</table>

Controller

app/controllers/user_controller.rb:

def verify
    hash_pass = password_hash(params[:user][:pass])
    user = User.find(:first, :conditions =>
        ["email = ? and pass = ? and is_active = 'true'", params[:user][:email], hash_pass])
    if user
        session['user'] = user
        user.record_login
        redirect_to :controller => "calendar", :action => "index"
    else
        flash['notice'] = "Bad username/password!"
        redirect_to :controller => "user", :action => "login"
    end
end