Step.09 開始修scaffold - Azraeil/JCcart_Note GitHub Wiki
fix app/views/dashboard/admin/items/_form.html.erb,只留下
<div class="actions">
<%= f.submit %>
</div>fix app/views/dashboard/admin/items/edit.html.erb
完整code
<h1>Editing Item</h1>
<%= form_for @item, dashboard_admin_item_path, method: :patch do |f| %>
<%= render 'form' %>
<% end %>
<%= link_to 'Show', @item %> |
<%= link_to 'Back', items_path %>先改成這樣,但是他的route是錯的
<h1>Editing Item</h1>
<%= form_for @item do |f| %>
<%= render 'form' %>
<% end %>
<%= link_to 'Show', @item %> |
<%= link_to 'Back', items_path %>我們rake routes,一樣看Controller#Action
dashboard_admin_items GET /dashboard/admin/items(.:format) dashboard/admin/items#index
POST /dashboard/admin/items(.:format) dashboard/admin/items#create
new_dashboard_admin_item GET /dashboard/admin/items/new(.:format) dashboard/admin/items#new
edit_dashboard_admin_item GET /dashboard/admin/items/:id/edit(.:format) dashboard/admin/items#edit
dashboard_admin_item GET /dashboard/admin/items/:id(.:format) dashboard/admin/items#show
PATCH /dashboard/admin/items/:id(.:format) dashboard/admin/items#update
PUT /dashboard/admin/items/:id(.:format) dashboard/admin/items#update
DELETE /dashboard/admin/items/:id(.:format) dashboard/admin/items#destroy
我們在edit頁面,送出表單後會透過HTML動詞Patch來update資料,所以我們要找dashboard/admin/items#update。我們會看到update沒有Prefix可以用,我們就找他的上面一個,也就是dashboard_admin_item因為查看URI Pattern他們都是在同一層,就能把form_for改成
<%= form_for @item, dashboard_admin_item_path, method: :patch do |f| %>
fix app/views/dashboard/admin/items/new.html.erb
完整code
<h1>New Item</h1>
<%= form_for @item, dashboard_admin_items_path, method: :post do |f| %>
名稱: <%= f.text_field :name %><br>
價格: <%= f.number_field :price %>
<button type="submit" >送出</button>
<% end %>我們一樣是要先看route,我們現在在new.html.erb按下submit後會透過HTML動詞POST來create一筆資料,所以我們要找dashboard/admin/items#create。找到後發現沒有Prefix,所以找上面一個,找到dashboard_admin_items
JC在此手刻了表單內容。
由於原本用scaffold生成的link_to "Back"他的路由是錯的,所以就先砍掉。
fix app/views/dashboard/admin/items/edit.html.erb
<h1>Editing Item</h1>
<%= form_for @item, dashboard_admin_item_path, method: :patch do |f| %>
名稱: <%= f.text_field :name %><br>
價格: <%= f.number_field :price %>
<button type="submit" >送出</button>
<% end %>由於link_to 'Show'、link_to 'Back'都是錯的,所以砍掉,表單內容改成先前手刻的
由於都沒用到_form.html.erb所以我們就去把他砍掉
delete app/views/dashboard/admin/items/_form.html.erb
fix app/views/dashboard/admin/items/index.html.erb
改成
<p id="notice"><%= notice %></p>
<h1>產品列表</h1>
<table>
<thead>
<tr>
<th>id</th>
<th>名稱</th>
<th>價格</th>
<th>管理</th>
</tr>
</thead>
<tbody>
<% @items.each do |item| %>
<tr>
<td><%= item.id %></td>
<td><%= item.name %></td>
<td><%= item.price %></td>
<td>
<%= link_to '編輯', edit_item_path(item) %>
<%= link_to '刪除', item, method: :delete, data: { confirm: '你確定嗎?' } %>
</td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Item', new_dashboard_admin_item_path %>最後面的<%= link_to 'New Item', new_item_path %>他的路由也是錯的,由於我們要建立一個新的item,所以我們rake routes去找dashboard/admin/items#new相對應的Prefix,也就是new_dashboard_admin_item而他是透過Html Verb Get,由於這邊是由scaffold生成的,所以我們可以不用給HTML Verb
我們透過在iTerm下指令的方式複製application.html.erb然後再去改它
jccart/app/views/layouts
ls
>> application.html.erb
cp application.html.erb dashboard.html.erb
cp application.html.erb admin.html.erb
ls
>> admin.html.erb application.html.erb dashboard.html.erb
fix app/views/layouts/application.html.erb
<body>
<h1>對外頁面:public</h1>
<% if current_user %>
...
...
...
</body> 這麼做的好處是,美工就能對這頁做美化
fix app/views/layouts/dashboard.html.erb
完整code
<!DOCTYPE html>
<html>
<head>
<title>JCcart</title>
<%= stylesheet_link_tag 'application', media: 'all' %>
<%= javascript_include_tag 'application' %>
<%= csrf_meta_tags %>
</head>
<body>
<h1>使用者後台: dashboard</h1>
Hi! <%= current_user.email %>, <%= link_to "登出", destroy_user_session_path, method: "delete" %>
<%= will_paginate @paginate if @paginate %>
<hr>
<%= yield %>
<hr>
<%= will_paginate @paginate if @paginate %>
</body>
</html>由於我們強制要登入,所以一定會有current_user可以用,所以delete current_user判斷式
fix app/views/layouts/admin.html.erb
<!DOCTYPE html>
<html>
<head>
<title>JCcart</title>
<%= stylesheet_link_tag 'application', media: 'all' %>
<%= javascript_include_tag 'application' %>
<%= csrf_meta_tags %>
</head>
<body>
<h1>後台頁面:admin</h1>
Hi! <%= current_manager.email %>, <%= link_to "登出", destroy_manager_session_path, method: "delete" %>
<hr>
<ul>
<li><%= link_to "商品管理", dashboard_admin_items_path %></li>
</ul>
<%= will_paginate @paginate if @paginate %>
<hr>
<%= yield %>
<hr>
<%= will_paginate @paginate if @paginate %>
</body>
</html>要注意:我們現在用的是管理者,所以路由要從user改成manager,current_user要改成current_manager
再來是link_to "商品管理"。我們要先看到全部商品,然後才能做編輯。為了要先看到全部商品,所以我們要去找iitems#index,所以我們要去路由找dashboard/admin/items#index,他的Prefix是dashboard_admin_items,這邊一樣是由scaffold生成的,所以不用給HTML Verb
去localhost:3000測試,需要先rake db:migrate,然後發現噴了。這是由於scaffold又幫我們建了20160907072602_create_items.rb與20160907073156_create_cates.rb,但是我們先前已經見過這兩個table了,所以我們下指令刪除它
jccart db/migrate
rm 20160907072602_create_items.rb
rm 20160907073156_create_cates.rb
然後我們再重整localhost:3000的頁面,就能順利work了。
測試時localhost:3000/dashboard/admin/items,會發現我們被轉到localhost:3000/managers/sign_in,要我們登入manager
我們剛剛manager的帳號密碼
帳號:[email protected] 密碼:werwerwer
進去後會發現,我們controller沒有打
fix app/controllers/dashboard/admin/items_controller.rb
class Dashboard::Admin::ItemsController < Dashboard::Admin::AdminController
def index
@items = @paginate = Item.paginate(:page => params[:page])
end
end然後重整頁面,就能順利進入localhost:3000/dashboard/admin/items
成功後會發現h1tag寫得是對外頁面:public,是因為我們少一個語句在controller內
fix app/controllers/dashboard/admin/admin_controller.rb
class Dashboard::Admin::AdminController < ApplicationController
before_action :authenticate_manager!
layout 'admin'
end當我們在 Dashboard::Admin::AdminController寫上layout 'admin'後,所有繼承他的controller,自動變成後台的頁面。