LoginSignup
2
3

More than 5 years have passed since last update.

Railsのscaffold generatorをカスタマイズ

Posted at

自分用メモ

やりたいこと

  • bootstrap用
  • breadcrumbsつける
  • i18nを参照してるのをgenerateしたい
  • noticeメッセージも辞書ファイル見てほしい
  • coffeescriptはgenerateしたくない

手順 

lib/templates 配下にテンプレートを作る

$ rake rails:templates:copy

application.rb

config.generators.javascripts = false

usual.ja.yml

usual.ja.yml
ja:
  usual:
    index: 一覧
    show: 詳細
    new: 新規
    edit: 編集
    delete: 削除
    confirm:
      delete: 削除しますが、よろしいですか?
    back: 戻る
    create:
      success: "%{name}を作成しました"
      failed: 作成に失敗しました
    update:
      success: "%{name}を更新しました"
      failed: 更新に失敗しました
    destroy:
      success: "%{name}を削除しました"
      failed: 削除に失敗しました
    form:
      error_explanation:
        title: "%{count}件のエラーがあります"

controller

controller.rb
<% if namespaced? -%>
require_dependency "<%= namespaced_file_path %>/application_controller"

<% end -%>
<% module_namespacing do -%>
class <%= controller_class_name %>Controller < ApplicationController
  before_action :set_<%= singular_table_name %>, only: [:show, :edit, :update, :destroy]
  before_action :set_breadcrumbs


  def index
    @<%= plural_table_name %> = <%= orm_class.all(class_name) %>
  end


  def show
  end


  def new
    @<%= singular_table_name %> = <%= orm_class.build(class_name) %>
  end


  def edit
  end


  def create
    @<%= singular_table_name %> = <%= orm_class.build(class_name, "#{singular_table_name}_params") %>

    if @<%= orm_instance.save %>
      redirect_to @<%= singular_table_name %>, notice: t('usual.create.success', name: <%= "'#{human_name}'" %>)
    else
      render :new
    end
  end


  def update
    if @<%= orm_instance.update("#{singular_table_name}_params") %>
      redirect_to @<%= singular_table_name %>, notice: t('usual.update.success', name: <%= "'#{human_name}'" %>)
    else
      render :edit
    end
  end


  def destroy
    @<%= orm_instance.destroy %>
    redirect_to <%= index_helper %>_url, notice: t('usual.destroy.success', name: <%= "'#{human_name}'" %>)
  end


private

  def set_<%= singular_table_name %>
    @<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
  end


  def set_breadcrumbs
    add_breadcrumb <%= class_name %>.model_name.human
  end


  def <%= "#{singular_table_name}_params" %>
    <%- if attributes_names.empty? -%>
    params[:<%= singular_table_name %>]
    <%- else -%>
    params.require(:<%= singular_table_name %>).permit(<%= attributes_names.map { |name| ":#{name}" }.join(', ') %>)
    <%- end -%>
  end
end
<% end -%>

index

index.html.erb
<h1>Listing <%= plural_table_name.titleize %></h1>

<table class="table table-striped table-bordered">
  <thead>
    <tr>
<% attributes.reject(&:password_digest?).each do |attribute| -%>
      <th><%%= <%= class_name %>.human_attribute_name :<%= attribute.name %> %></th>
<% end -%>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
      <tr>
<% attributes.reject(&:password_digest?).each do |attribute| -%>
        <td><%%= <%= singular_table_name %>.<%= attribute.name %> %></td>
<% end -%>
        <td><%%= link_to t('usual.show'), <%= singular_table_name %>, class:'btn btn-default' %></td>
        <td><%%= link_to t('usual.edit'), edit_<%= singular_table_name %>_path(<%= singular_table_name %>), class:'btn btn-default' %></td>
        <td><%%= link_to t('usual.delete'), <%= singular_table_name %>, method: :delete, data: { confirm: t('usual.confirm.delete') }, class:'btn btn-danger' %></td>
      </tr>
    <%% end %>
  </tbody>
</table>

<br>

<%%= link_to t('usual.new'), new_<%= singular_table_name %>_path, class:'btn btn-default' %>

form

_form.html.erb
<%%= form_for(@<%= singular_table_name %>) do |f| %>
  <%% if @<%= singular_table_name %>.errors.any? %>
    <div id="error_explanation">
      <h2><%%= pluralize(@<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:</h2>

      <ul>
      <%% @<%= singular_table_name %>.errors.full_messages.each do |message| %>
        <li><%%= message %></li>
      <%% end %>
      </ul>
    </div>
  <%% end %>

<% attributes.each do |attribute| -%>
  <div class="field form-group">
<% if attribute.password_digest? -%>
    <%%= f.label :password %><br>
    <%%= f.password_field :password, :class => "form-control" %>
  </div>
  <div class="field">
    <%%= f.label :password_confirmation %><br>
    <%%= f.password_field :password_confirmation, :class => "form-control" %>
<% else -%>
    <%%= f.label :<%= attribute.column_name %> %><br>
    <%%= f.<%= attribute.field_type %> :<%= attribute.column_name %>, :class => "form-control" %>
<% end -%>
  </div>
<% end -%>
  <div class="actions">
    <%%= f.submit :class => "btn btn-primary" %>
  </div>
<%% end %>

rails g scaffold user name でできたもの

users_controller.rb
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]
  before_action :set_breadcrumbs


  def index
    @users = User.all
  end


  def show
  end


  def new
    @user = User.new
  end


  def edit
  end


  def create
    @user = User.new(user_params)

    if @user.save
      redirect_to @user, notice: t('usual.create.success', name: 'User')
    else
      render :new
    end
  end


  def update
    if @user.update(user_params)
      redirect_to @user, notice: t('usual.update.success', name: 'User')
    else
      render :edit
    end
  end


  def destroy
    @user.destroy
    redirect_to users_url, notice: t('usual.destroy.success', name: 'User')
  end


private

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


  def set_breadcrumbs
    add_breadcrumb User.model_name.human
  end


  def user_params
    params.require(:user).permit(:name)
  end
end
index.html.erb
<h1>Listing Users</h1>

<table class="table table-striped table-bordered">
  <thead>
    <tr>
      <th><%= User.human_attribute_name :name %></th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @users.each do |user| %>
      <tr>
        <td><%= user.name %></td>
        <td><%= link_to t('usual.show'), user, class:'btn btn-default' %></td>
        <td><%= link_to t('usual.edit'), edit_user_path(user), class:'btn btn-default' %></td>
        <td><%= link_to t('usual.delete'), user, method: :delete, data: { confirm: t('usual.confirm.delete') }, class:'btn btn-danger' %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to t('usual.new'), new_user_path, class:'btn btn-default' %>
_form.html.erb
<%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field form-group">
    <%= f.label :name %><br>
    <%= f.text_field :name, :class => "form-control" %>
  </div>
  <div class="actions">
    <%= f.submit :class => "btn btn-primary" %>
  </div>
<% end %>
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3