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>