rails 独学して軽くにちゃんまとめつくる

インターン中大学生のブログ

ぐるぐる回って何をしたいのかが変わってく。今はマッチングサイトを作りたい、もしくは論文のキュレーションサイトかな。

ユーザー作成

コントローラー

rails g controller Usrs

ルーティング

signup 'signup' => 'users#new'

resources :users

 

ビュー

showf:id:mooooooooooriiiiii:20161220140546p:plain

<% provide(:title, @user.name) %>
<div class="row">
  <div class="col-md-4">
    <section class="user_info">
      <h1>
        <% gravatar_for @user %>
        <% @user.name %>
      </h1>
    </section>
  </div>
</div>

画像を与えるために gravatar_for メソッドを作成する。やってることはわかるのだが、こんなん覚えなくてもいいよ。

module UsersHelper
  # 引数で与えられたユーザーのGravatar画像を返す
  def gravatar_for(user, options = { size: 80 })
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    size = options[:size]
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end

コントローラー

def show
  @user = User.find(params[:id])
end

 

new

これもかなり素直。フォームを作るだけ。ただ、submit に btn btn-primary クラスをつけることと、form タグにはすべて = をつけることを忘れずに

 

def new
    @user = User.new
end

 

フォーム

<% provide(:title, 'sign up') %>
<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 col-offset-md-3">
    <%= form_for @user do |f| %>
<%= render 'shared/error_messages', object: f.object %>
    <%= f.label :name, class: 'form_control' %>
    <%= f.text_field :name, class: 'form_control' %>
 
    <%= f.label :email, class: 'form_control' %>
    <%= f.email_field :emai, class: 'form_control' %>
 
    <%= f.label :password, class: 'form_control' %>
    <%= f.password_field :password, class: 'form_control' %>
 
    <%= f.label :password_confirmation, "Confirmation", class: 'form_control' %>
    <%= f.password_field :password_confirmation, class: 'form_control' %>
 
    <%= f.submit "Sign up!", class: "btn btn-primary form_control" %>
  <% end %>
  </div>
</div>

 

create

前後でメッセージを表示させる必要があるから、それの実装がややこしい。ただしややこしいだけで、やってることは簡単。要はview のないアクションの条件ぜんごにメッセージをつけますよ、というだけの話。

 

コントローラー

 def create
    @user = User.new(user_params)
    if @user.save
      flash[:success] = "welcome to sample app"
      redirect_to @user
    else
      render 'new'
    end
  end

 

app/views/shared/_error_messages.html.erb

フォーム入力でメッセージが表示されるようにする。

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(object.errors.count, "error") %>.
    </div>
    <ul>
    <% object.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

appplication.erb

flashでメッセージが表示されるようにする

<% flash.each do |message_type, message| %>
  <div class="alert alert-<%= message_type %>"><%= message %></div>
<% end %>

<%= yild %>

 

 

 

 

 

 

 

 

 

モデル

rails g model User name:string email:string passworddigest:string

 

 

バリデーション

name

 validates :name,  presence: true, length: {maximum: 50}

 email

  VALID_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALIDexi_REGEX },
                    uniqueness: { case_sensitive: false }



private
  def downcase_email
    self.email = email.downcase
  end
 

 

$ rails generate migration add_index_to_users_email

けんさくするときに必要になるのが index。ログインするときとかに使うからインデックスをいれておく。

class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
  def change
    add_index :users, :email, unique: true
  end
end

 

 

パスワード

 

なんてことの内容に書いてるが、 has_secure_password というのを使いたいがための作業。それをするには bcrypt という gem をインストールする必要があり、カラムに password_digest を追加する必要がある。さすれば password , password_confirmation というマジックカラムと authentiacate というメソッドを使うことができる。

gem 'bcrypt',         '3.1.11'
$ bundle install

バリデーションに付け加えておく。

has_secure_password
validates :password, presence: true, length: {minimum: 6}

 

a_b@gmail.com