over 2 years ago

重點1:
Controller的名字要加sModel的名字不加s
不過,migration的檔案裡面,create_table的時候,Table名稱都會加s。(create_table :users do |t|)
所以,在做relation的時候,就不用加s。(has_many :item)

重點2:
要用Mysql,怎麼安裝
(不過,我的電腦是Darwin,好像不能用apt-getsudo apt-get install mysql-server這好像是Ubuntu的指令)
(參考

  1. 進階開發環境安裝
  2. mac安裝mysql的兩種方法(含配置)
  3. [SQL]在Mac與Ubuntu上安裝MySQL與登入設定
  4. Ubuntu 安裝和設定 MySQL

重點3:
正確的使用git的方法:git init --bare prodject.git
(網路上是查到裸庫

重點4:
merge的正確方法:
要先由branch去合併master
然後再由master去合併branch

重點5:
rails 預設的資料庫是sqlite
在新建新的application的時候要先用-d去把預設的資料庫換成mysql
-d 重新設定資料庫為mysql
rails new project --database=mysql

1:25

Sqlite是一個檔案式的資料庫
很多人進入網站時不能用
一開始就要建好mySQL

2:00

sudo apt-get install mysql-server

apt是一種安裝方式

還需要一個東西,電腦如果沒有

sudo apt-get install libmysqlclient-dev
gem i mysql2

要裝mysql2的gem,必須要有libmysqlclient-dev,
要有libmysqlclient-dev,要先裝mysql-server

4:00

開始講git
ROR TUTORIAL Chapter 1:11. First-time repository setup

4:50

建議方法A:

git init --bare prodject.git

不建議方法B:不能跟別人協同開發 (網路上都教這個,是錯的):

git init project 

不建議方法C:不能跟別人協同開發 (網路上都教這個,是錯的):

git init 

建議方法A:
打ls 之後,會看到一個project.git的資料夾,裡面會有
branches config description HEAD hooks info objects refs等資料夾

不建議方法B跟不建議方法C:
打ls 之後,裡面沒有東西
打ls -al,才會看到.git,不過不能分享給別人
要有project.git才能用git clone這些功能

7:50

把遠端的東西抓下來

git clone

11:00

git status
git add init 加到一個暫存的狀態
git commit -m "註解"
git push origin master

13:00

弄一個project2

git clone /home/imroot/git_temp/project.git/

15:00

git add -A 全部加到一個暫存的狀態
git commit -m
git status 
git push

換到project 2
git pull下來

17:00

衝突的解法

git add -A
git commit
git push   會出現rejected會被中斷掉

解法:git pull
會開始執行auto merge,只要不是同一行就會成功,同一行會失敗
會顯示哪一個檔案merge失敗
到檔案去修改,然後會出現both modified
還是衝突狀態

git add filename之後會變成
modified
這樣就可以commit了
git commit
git push

到projct 2
再執行git pull
就可以了

23:00

git pull之後,如果沒有conflict,就會auto merge成功,就會進到commit的畫面

24:45

講branch

git branch newbranch

小寫d刪除,還沒被merge

git -d branchname 

大寫D,強制刪除

git -D branchname 
git checkout branchname

28:50

merge要先由branch去合併master
然後再由master去合併branch

git checkout brancename
git merge master
auto merge會有conflict,要解conflict之後
git add -A
git commit -m 'fix'
git checkout master
git merge branchname

32:00

git log 可以看過去的所有的commit
git checkout commit_number

34:00

git總整理

git clone init --bare project.git

37:00

開始講rails

rails --help
預設資料庫: sqlite
-d 重新設定資料庫為mysql

rails new project --database=mysql

40:45

project/project$ rails --help 出現的東西會不一樣

41:50

設定mysql的帳號密碼
database.yml (我的現在是sqlite的格式)

yml檔很注意縮排,縮排代表分段

default:&default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: imroot
  password: imroot
  socket: /var/run/mysqld/mysqls.socket

  production:
   <<: *default
   database: project_production
   username: imroot
   password: imroot

44:00

Gemfile管理版本

46:00

Gemfile.lock這個project裡面所有相依性的gem,要寫到gemfile裡面去之後,才能夠使用。

49:00

開始講所有的檔案
temp README.rdoc public lib Gemfile config.ru bin vendor test Rakefile log Gemfile.lock db config app

53:45

config :所有的設定檔都在這邊,偷別人的就要偷這個
database.yml 資料庫的設定檔

56:00

config/environment
rails分三個模式 development.rb production.rb test.rb

1:00:00

config/secrets.yml
session會被竊取,不要給別人看到

1:03:00

開始實做migration
mysql很重要(我的顯示不出來東西)

mysql -u root -p
如果有一萬筆資料,ruby要用each跑一萬次,mysql只要一行程式

1:08:00

rails g migration init_db
其實只是弄了一個空的檔案,可以打開檔案
把 def change 改成 up(升版,新增) 跟 down (降版,刪除)

1:19:00

def change:
rake db:migrate => 就是up
rake db:rollback => 就是down

1:23:00

最困難的relation開始了

1:25:00

重要的東西放在user table
雜七雜八的放在 profile

1:27:00

一個user只能有一個profile
add_index :profile , [:user_id], :unique => true

1:29:00

資料庫裡面永遠只有一對一

左手拉右手
book_owners
:user_id
:book_id

1:30:00

books
t.string :owner_type
polymorphism
為了跨除一個table只能對一個對象的終極解法

1:31:00

單表繼承 - STI
animal
t.string :type
其他地方不能用type 這個關鍵字

1:35:00

User.rb
has_many :item
建議不要加s。
DB層有s,model層之後都不要有s
ps.
Controller的名字要加s,Model的名字不要加s,
不過,migration的檔案裡面,create_table的時候,Table名稱都會加s。(create_table :users do |t|)
所以,在做relation的時候,就不用加s。(has_many :item)

1:37:00

Profile.rb

1:45:00

user = User.where("name = ?", "Kitty")

1:48:00

user = User.first
profile = Profile.create(:user => user)

因為 User has one Profile
所以放:user => user,Profile自己就會去找到user的id放進:user_id這個column裡面

1:48:00

profile.user
User.find(profile.user.id)

兩個跑出來的結果是一樣的,
可以寫成profile.user主要是因為有寫User has one Profile。
不過就算是沒有寫User has one Profile,也可以打User.find(profile.user.id)找到對應的user.

1:50:00

開始講Book

book = Book.create(:owner => user, :title => "hihi")
owner_type會顯示Class
polymorphism的機制

1:54:00

User has many Book throght Book_Owner
打user.book可以列出book,
是因為mysql的INNER JOIN的語法

1:54:25

不建議“多對多對多”,因為用太多INNER JOIN會拖累速度
這種結構用越少越好
建議用一對多,多對一,或一對一,或快取的方式去拆

1:57:00

polymorphism
ownwer_type: "User"
也可以改成Book,也可以改成Profile
一個東西可以對應到很多table

1:58:00

STI
animal的 type是nil
Cat.create(:name => 'cat')
Cat type:"Cat"

2:12:00

User has one Profile
Profile belongs to User

要同時設定兩邊,才可以由左到右,然後由右到左
user.profile.user
不然只能由一邊到另一邊,不能由另一邊回來一邊

2:13:00

開始講routes
config/routes.rb

先建網址(routes),再建Controller,然後才是View

2:19:00

http的header (get post patch put delete)不一樣,來導到不同的網址

2:21:00

match "/hoo" , :to => "static#test" , :via => [:post, :delete]

限定/hoo這個網址,只有:post跟:delete可以進來

2:31:00

講callback

before_action :hihi

private
def hihi
end

執行這個controller的時候,會先執行hihi這個method,所以其他的method就不用執行一樣的工作。

2:34:00

(.:format)是可以接json那些東西的意思

2:36:00

render跟redirect to

render抓後面的action
redirect_to: 網址會變

2:39:45

views/layouts/application.html.erb

2:42:00

修改完application.html.erb後,再去改其它頁面

<% content_for :head do %>
    hihi i am hea
<% end %>

<% content_for :footer do %>
    hihi i am footer
<% end %>

layout打得好的人,可以塞東西到他想要的地方去

2:45:00

items_controller
def hoo
    render :layout => "dashboard" **(要用string)**
end

進到hoo的頁面的時候,會去抓dashboard的頁面
local:3000/yoo/234

2:46:00

layout 'dashborad' 會有一樣的效果

不同的controller可以抓不同的layout,活性會變很大

2:48:00

html escape
怕被入侵

2:51:00

HELPER

module ApplicationHelper

    def test_me
        return (0..100).to_a.join("|")
    end 

end

到hoo.html.erb
<%= test_me %>
就可以用這個method了。
可以在view使用的程式

2:54:00

_partial
部分的html,不能被action直接用
到html裡面使用
<%= render 'partial' %>
menu啊,logo可以用

2:56:00

示範scaffold

rails g scaffold --help

← Rails Guide - Association RailsFun.tw 新手教學 day3 HD →