【Rails 应用实战】1. 前言与案例准备

67 阅读1分钟

1-1 前言

本课程收集各种常用的Ruby on Rails 锦囊妙计。

1-2 案例准备

接下来几堂的实战应用章节中,会基于一个活动(Event)报名系统的情境:

  • 用户可以在前台看到活动信息
  • 管理员可以在后台管理活动资料
  • 管理员可以在后台管理用户资料
  • 用户可以在前台进行报名
  • 管理员可以在后台管理报名资料

为了让大家可以快速开始练习重点,请直接 clone 这个项目:github.com/jerikchan/r…

请依序执行:

rails new rails-event-list

cd rails-event-list

安装身份验证解决方案 Devise github.com/heartcombo/…

gem "devise"

bin/rails generate devise:install

bin/rails generate devise User

bin/rails db:migrate

bin/rails g devise:views

在 /config/environments/development.rb 中加上

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

bin/rails generate model events name:string description:text user_id:integer

bin/rails generate controller events

bin/rails db:migrate

/app/controllers/events_controller.rb

class EventsController < ApplicationController
  def index
    @events = Event.all
  end

  def show
    @event = Event.find params[:id]
  end
end

/app/views/events/index.html.erb

<h1>Event List</h1>

<ul>
  <% @events.each do |event| %>
    <li>
      <%= link_to event.name, event %>
    </li>
  <% end %>
</ul>

/app/views/events/show.html.erb

<h1><%= @event.name %></h1>

<%= simple_format @event.description %>

/config/routes.rb

Rails.application.routes.draw do
  devise_for :users

  root "events#index"

  resources :events
  namespace :admin do
    root "events#index"
    resources :events
  end
end

bin/rails generate controller admin/events

/app/controllers/admin/events_controller.rb

class Admin::EventsController < ApplicationController
  def index
    @events = Event.all
  end

  def show
    @event = Event.find params[:id]
  end

  def new
    @event = Event.new
  end

  def create
    @event = Event.new event_params
    if @event.save
      redirect_to admin_events_path
    else
      render :new, status: :unprocessable_entity
    end

  def edit
    @event = Event.find params[:id]
  end

  def update
    @event = Event.find params[:id]
    if @event.update(event_params)
      redirect_to admin_events_path
    else
      render :edit, status: :unprocessable_entity
    end
  end

  def destroy
    @event = Event.find params[:id]
    @event.destroy

    redirect_to admin_events_path
  end
end

/app/views/admin/events/index.html.erb

<h1>Admin Event List</h1>

<p class="text-right">
<%= link_to "New Event", new_admin_event_path, :class => "btn btn-primary" %>
</p>

<table class="table">
<tr>
  <th>Event Name</th>
  <th>Actions</th>
</tr>
<% @events.each do |event| %>
  <tr>
    <td><%= link_to event.name, admin_event_path(event) %></td>
    <td>
      <%= link_to "Edit", edit_admin_event_path(event), :class => "btn btn-default" %>
      <%= link_to "Delete", admin_event_path(event), data: {  turbo_method: :delete, turbo_confirm: "Are you sure?" }, :class => "btn btn-danger" %>
  </tr>
<% end %>
</table>

/app/views/admin/events/show.html.erb

<h1><%= @event.name %></h1>

<p>
  <%= link_to "打开前台", event_path(@event), :target => "_blank", :class => "btn btn-primary" %>
</p>

<%= simple_format @event.description %>

/app/views/admin/events/new.html.erb

<h1>New Event</h1>

<%= form_for [:admin, @event] do |f| %>

  <%= render :partial => "form", :locals => { :f => f } %>

  <div class="form-group">
    <%= f.submit "Create", :class => "btn btn-primary" %>
    <%= link_to "Cancel", admin_events_path %>
  </div>
<% end %>

/app/views/admin/events/edit.html.erb

<h1>Edit Event</h1>

<%= form_for [:admin, @event] do |f| %>

  <%= render :partial => "form", :locals => { :f => f } %>

  <div class="form-group">
    <%= f.submit "Update", :class => "btn btn-primary" %>
    <%= link_to "Cancel", admin_events_path %>
  </div>
<% end %>

/app/views/admin/events/_form.html.erb

<% if @event.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@event.errors.count, "error") %> prohibited this person from being saved:</h2>

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

<div class="form-group">
  <%= f.label :name %>
  <%= f.text_field :name, :class => "form-control" %>
</div>

<div class="form-group">
  <%= f.label :description %>
  <%= f.text_area :description, :class => "form-control" %>
</div>