2015年12月2日 星期三

Cloud9-RoR-Authentication:devise 安裝篇

參考文章:https://ihower.tw/rails4/auth.html
參考文章:http://railsgirls.tw/devise/
除錯文章:http://stackoverflow.com/questions/16801561/devise-helpers-authenticate-user-current-user-user-signed-in-not-initializ   #16,不用管see more (ErrorMsg: undefined method `authenticate_user!' for ...)
除錯文章:http://nt46.logdown.com/posts/2013/08/25/ror-devise-in-every-page-with-login-form  (ErrorMsg: undefined local variable or method `resource' for ...)
詳細文章:http://hibbard.eu/authentication-with-devise-and-cancancan-in-rails-4-2/  這篇講了很多功能,不過目前我還沒做到這麼複雜

快來說說一波三折的devise怎麼使用吧!

Gemfile檔加上
# Authentication: Devise
gem 'devise'

輸入指令安裝devise套件
$ bundle install

產生devise設定檔
$ rails g devise:install

Create the User model
$ rails g devise user

產生樣板,這會包括註冊、登入、忘記密碼、Email等等頁面,並放在app/views/devise目錄下
$ rails generate devise:views

建立資料表
$ bin/rake db:migrate

編輯config/environments/development.rb 和 production.rb,加入mailer的資訊
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

編輯app/views/layouts/application.html.erb,在<%= yield %>上方加入
<% if current_user %>
    <%= link_to('登出', destroy_user_session_path, :method => :delete) %> |
    <%= link_to('修改密碼', edit_registration_path(:user)) %>
<% else %>
    <%= link_to('註冊', new_registration_path(:user)) %> |
    <%= link_to('登入', new_session_path(:user)) %>
<% end %>
      
<% if notice %>
  <p class="alert alert-success"><%= notice %></p>
<% end %>
<% if alert %>
  <p class="alert alert-danger"><%= alert %></p>
<% end %>

編輯app/controllers/application_controller.rb,在protect_from_forgery with: :exception下方加入
  before_action :authenticate_user!  

檢查routes.rb是不是有指定首頁了,像是
  root :to => "mains#index"

在routes.rb中加入
  devise_for :users

因為我需要E-mail驗證功能,所以需要將相關設定(confirmable)開啟
編輯app/models/user.rb
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

編輯migration/xxxxx_devise_create_users.rb
      ## Confirmable
      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable

加上username自訂欄位
$ rails g migration add_username_to_users

檔案打開加上
add_column :users, :username, :string

新增欄位
$ bin/rake db:migrate

編輯application_controller.rb,加上configure_permitted_parameters
  before_action :configure_permitted_parameters, if: :devise_controller? 
  
  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :username
    devise_parameter_sanitizer.for(:account_update) << :username
  end  

編輯views/devise/registrations/edit.html.erb和views/devise/registrations/new.html.erb,加上username欄位
  <div><%= f.label :username %><br />
  <%= f.text_field :username %></div>

編輯app/helpers/application_helper.rb,加上
  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end  

如此一來,就能順利看到登入頁面了。

2015年11月30日 星期一

Cloud9-RoR-加上關鍵字搜尋

參考文章:https://ihower.tw/rails4/restful-practices.html (下方處)
(上述參考文章有錯誤之處,請以本篇為主)

怎麼在頁面上加上keyword search呢?

先修改要加上keyword search的頁面,以events/index.html.erb當範例,在最上方加入下例程式
<%= form_tag events_path, :method => :get do %>
  <%= text_field_tag "keyword" %>
  <%= submit_tag "Search" %>
<% end %>

修改events_controller裡index的內容
  def index
    if params[:keyword]
      @events = Event.where(["title LIKE ? OR description LIKE ?", "%#{params[:keyword]}%", "%#{params[:keyword]}%"]).page(params[:page]).per(5)
    else
      @events = Event.page(params[:page]).per(5)
    end
  end

這麼一來就擁有keyword search的功能了。

2015年11月26日 星期四

Cloud9-RoR-export seeds.rb

seeds.rb檔---用來餵db table裡相關的(或範例)資料。

在ruby on rails中,我們知道可以利用bin/rake db:migrate可以快速的就建立好資料表,但資料內容呢?

每次都要重新建立,好像太麻煩了點,而且我有個迷思:寧願把時間花在寫程式上,也不想要花在key資料上。於是查了一下有沒有可以方便export seeds.rb檔的方法,因為seeds.rb檔不會自動產生,要手動編輯資料才行…不~~~

在這邊就提供兩個網路上現成的方法,一個比較笨但是很容易上手,另一個相反,方便可相對的前置動作也較繁雜。

笨拙上手容易
參考文章:http://www.xyzpub.com/en/ruby-on-rails/3.2/seed_rb.html
參考文章:http://railsguides.net/how-to-generate-rake-task/
我們只要準備好一個rake檔就行了,內容怎麼改呢?
namespace :export do
  desc "Prints xxxxs.all in a seeds.rb way."
  task :xxxxs_seeds_format => :environment do
    Xxxx.order(:id).all.each do |xxxx|
      puts "Xxxx.create(#{event.serializable_hash.delete_if {|key, value| ['created_at','updated_at','id'].include?(key)}.to_s.gsub(/[{}]/,'')})"
    end
  end
end
xxxx的部份就是資料表的名稱,像是event,還有要看清楚複數及單數的地方及需要大寫的部份。

不只一個table欸,那就在新增desc的部份。
namespace :export do
  desc "Prints xxxxs.all in a seeds.rb way."
  task :xxxxs_seeds_format => :environment do
    Xxxx.order(:id).all.each do |xxxx|
      puts "Xxxx.create(#{event.serializable_hash.delete_if {|key, value| ['created_at','updated_at','id'].include?(key)}.to_s.gsub(/[{}]/,'')})"
    end
  end

  desc "Prints yyys.all in a seeds.rb way."
  task :yyys_seeds_format => :environment do
    Yyy.order(:id).all.each do |event|
      puts "Yyy.create(#{yyy.serializable_hash.delete_if {|key, value| ['created_at','updated_at','id'].include?(key)}.to_s.gsub(/[{}]/,'')})"
    end
  end
end

接著就是下指令
$ rake export:xxxxs_seeds_format
$ rake export:yyys_seeds_format
會印出xxxxs及yyys table的資料。

很簡單吧!只不過每個table都要獨立寫出來,然後一一下指令執行,萬一table數量很多,感覺好像太不便民了一些是吧!所以才會又找另一個方法!

方便複雜度高
參考文章:https://github.com/kevTheDev/seed_dumper

這個方法要準備的檔案就比較多了,先把整個專案載下來,再一一放到我們的專案裡。基本上專案中沒有的檔案都能原封不動的複製過去,至於已經有的相關檔案,請copy來源檔的內容後,再貼到專案的同個檔案裡,不要直接覆蓋掉原本的檔案哦!就不在做詳細說明了,今天的我有點懶…

檔案都就緒後,就是下指令了
$ rake db:seed:dump

如果你也出現一堆WARN,嗯…我也是這樣,似乎是某個gem工具版本不符合,但檔案還是有正常輸出,既然不會造成問題就不跟他計較了。

可以檢查db folder裡新增了一個seed folder,只是輸出的檔案也跟我想的不大一樣,不是全部寫到seeds.rb,而是分別輸出各個table的rb檔,不過這樣也好,萬一我們只需要某個table的資料,就可以只針對想要的table做seed就好。

匯入資料庫
看來還是要把輸出得資料複製到seed.rb裡,目前研究的結果只能針對seed.rb檔做匯入,而且有個問題,如果table的欄位是使用date/datetime,匯出時是不包含雙引號的,但這樣匯入時會出錯,必需自行補上才行…oh my god!

匯入seed.rb檔指令的寫法
$ rake db:seed

怎麼分辨成功與否?沒有出現任何訊息就代表成功匯入資料了,如果下方出現一堆訊息就是有問題,訊息內會指出有錯誤的地方,修正後再重下指令就行了,希望大家匯入匯出都順利!

2015年11月24日 星期二

Cloud9-RoR-使用github create/rename a workspace

為什麼create/rename要寫一起呢,因為操作動作都一樣,cloud9無法rename專案名稱,所以需要先把想rename的專案上傳到github,再create一個新專案把檔案載下來。

github教學:https://www.dotblogs.com.tw/clark/archive/2014/02/12/143957.aspx
我是使用TortoiseGit,照著這篇文章的步驟做,很輕鬆就可以學會嘍!不過每次傳檔時就會讓我想到龜派氣功溜!

github官網:https://github.com/
官網也有做很詳細的操作教學哦!不過基本上我們不需要在github官網上做任何操作,只要網址就行了。

參考文章:https://docs.c9.io/v1.0/docs/create-a-workspace#section-git-source
參考來源:http://stackoverflow.com/questions/31574831/zsh-permission-denied-bin-rake

請先參考文章連結,才知道怎麼把github的檔案download到專案裡哦!
Clone from Git or Mercurial URL (optional)欄位的連結參考
https://github.com/uraccount/urworkspace

雖然用github可以很快速的把專案完整載下來,但是環境卻不完整,權限也不足…只好東補西補,感覺比開一個新專案更麻煩欸!

首先,因為環境不完整的關係,先把環境補強起來
$ bundle install

再來是權限不足的問題,讓github/master擁有bin/rake db:migrate指令的權限
$ chmod +x bin/*

在cloud9底下新建一個專案就等於重新使用一台新主機,所以要記住自己當初灌了哪些東西,記得在這邊也要全部重灌過哦!
$ mysql-ctl install
$ gem install -v 0.3.19 mysql2
$ gem install kaminari

Maybe不用做最後一行,因為我是先灌kaminari才執行bundle install,如果是倒過來做不知道會不會有差異,也許已經灌好了也說不定。

執行下列指令,把資料表建立起來
$ bin/rake db:migrate

cloud9的專案名稱不一定要跟github上的repository名稱一樣,至於在github上目錄的層級,我是把repository當成與workspace是同層目錄,所以只放了workspace底下的檔案,像醬
































希望大家操作順利嘍!

文章只花了短短1、2個小時就整理完畢,這背後其實是花了1、2天的時間不斷的再操作測試啊啊啊啊!

2015年11月22日 星期日

Cloud9-RoR-mysql2 & rails 版本衝途

參考來源:http://stackoverflow.com/questions/22932282/gemloaderror-for-mysql2-gem-but-its-already-in-gemfile

在開新專案時遇到了版本不相容的問題,mysql2 version 0.4.x 看來是無法在 rails version 4.x.x 底下使用。

所以只好安裝特定的mysql2版本,上網查了一下0.3.18幾乎大家都推這個版本,不過我發現我之前的專案是安裝0.3.19,所以決定安裝19這版。
gem install -v 0.3.19 mysql2

如果先前已經安裝過mysql2了,這時應該會出現兩個版本,怎麼查呢?
gem list

會列出所有已安裝的gem函式庫及其版本,然後記得在Gemfile裡指定版本哦!
# Use mysql2 as the database for Active Record
gem 'mysql2', '0.3.19'

如果只有安裝一個版本,'0.3.19'的部份就可以不用寫了。



2015年11月15日 星期日

Cloud9-RoR-where條件

參考文章:http://guides.rubyonrails.org/active_record_querying.html
連結內容說的還挺清楚的,我只用到一些比較簡單的部份而已。

修改routes.rb檔,在最前面加上
  root :to => "mains#index"
  resources :mains

新增一個mains_controller,當前台用
$ rails g controller mains

編輯mains_controller.rb,內容如下
  def index
    @mains = Event.where("public_date <= ?", Time.now)
  end
  
  def show
    @main = Event.find(params[:id])
  end  
  
  def origin
  end
  
  def service
  end
  
  def publ_index
    @mains = Event.where("cnttype = ?", 1)
  end
  
  def publ_content
    @main = Event.find(params[:id])
  end
  
  def case_index
    @mains = Event.where("cnttype = ?", 2)
  end
  
  def case_content
    @main = Event.find(params[:id])
  end

在view/mains/底下新增index.html.erb檔,內容如下
<ul>
<% @mains.each do |event| %>
  <li>
  <%= event.title %>
    <% event.categories.where(status: 1).each do |g| %>
      <%= g.cname %>
   <% end %>
  <%= link_to "Show", main_path(event) %>
  </li>
<% end %>
</ul>

再新增show.html.erb檔,內容如下
<p><%= @main.title %></p>
<p>
<% @main.categories.each do |g| %>
  <%= g.cname %>
<% end %>
</p>
<table border="0">
  <tr>
    <td><%= @main.public_date %></td>
    <td><%= @main.author %></td>
  </tr>
</table>
<p><%= simple_format(@main.description) %></p>

<p><%= link_to 'Back to index', mains_path %></p>

前台的首頁就大概草擬好了。

2015年11月12日 星期四

Cloud9-RoR-checkbox多對多

參考文章:https://ihower.tw/rails4/restful-practices.html

在這之前請先把categories model建立好哦,照著CRUD的方式就行了。

在_form.html.erb增加三行,放在自己想顯示的位置
<div>
<%= f.collection_check_boxes(:category_ids, Category.all, :id, :cname) %>
</div>

修改events_controller.rb的event_params
  def event_params
    params.require(:event).permit(:cnttype, :description, :author, :is_public, :public_date,
    :category_ids => [])
  end

在events/index.html.erb增加
  <% event.categories.each do |g| %>
    <%= g.cname %>
  <% end %>

在events/show.html.erb增加
<% @event.categories.each do |g| %>
  <%= g.cname %>
<% end %>

這樣就能在events表單中看到categories的checkbox清單嘍!

2015年9月15日 星期二

Cloud9-RoR-關聯設計

參考文章:https://ihower.tw/rails4/activerecord.html

我的資料表關聯是這樣的


新增兩個model(原本的events在前面幾篇就建好了)
$ rails g model category cname:string status:boolean
$ rails g model event_category event_id:integer category_id:integer
$ bin/rake db:migrate

編輯app/models/event.rb
class Event < ActiveRecord::Base
  has_many :event_categories, ->{ order("category_id") }, :dependent => :delete_all
  has_many :categories, :through => :event_categories
end

編輯app/models/category.rb
class Category < ActiveRecord::Base
  has_many :event_categories, :dependent => :delete_all
  has_many :categories, :through => :event_categories
end

編輯app/models/event_category.rb
class EventCategory < ActiveRecord::Base
  belongs_to :event
  belongs_to :category
end

如此一來,三個資料表就關聯起來了。

2015年9月14日 星期一

Cloud9-RoR-Can't connect to MySQL server...

每次只要重新開啟專案,似乎都會出現無法連線到MySQL的錯誤
rake aborted!
Mysql2::Error: Can't connect to MySQL server on '0.0.0.0' (111)
.
.
.

這時只要重啟MySQL就行了,在指令處下
$ mysql-ctl restart

這樣就能正常連線嘍!

2015年9月8日 星期二

Cloud9-RoR-RESTful應用

參考文章:https://ihower.tw/rails4/restful.html

修改config/routes.rb,增加resources :events,
刪除match ':controller(/:action(/:id(.:format)))', :via => :all
resources :events
*在routes.rb裡面,越上面的路由規則越優先。

重要的表格:
Helper GET POST PATCH/PUT DELETE
event_path(@event) /events/1
show action
/events/1
update action
/events/1
destroy action
events_path /events
index action
/events
create action
edit_event_path(@event) /events/1/edit
edit action
new_event_path /events/new
new action
輸入下列指令可以看到目前的routes.rb有哪些規則
$ bin/rake routes

修改app/views/events/index.html.erb
<ul>
<% @events.each do |event| %>
  <li>
  <%= event.title %>
  <%= link_to "Show", event_path(event) %>
  <%= link_to 'Edit', edit_event_path(event) %>
  <%= button_to 'Delete', event_path(event), :method => :delete, :data => { :confirm => "Are you sure?" } %>
  </li>
<% end %>
</ul>
<%= link_to 'New Event', new_event_path %>
<%= paginate @events %>

修改app/views/events/new.html.erb
<p><%= @event.title %></p>
<table border="0">
  <tr>
    <td><%= @event.public_date %></td>
    <td><%= @event.author %></td>
  </tr>
</table>
<p><%= simple_format(@event.description) %></p>

<p><%= link_to 'Back to index', events_path %></p>

修改app/views/events/new.html.erb
<%= form_for @event, :url => events_path do |f| %>
    <%= render :partial => 'form', :locals => { :f => f } %>
    <%= f.submit "Create" %>
    <%= link_to 'Back to index', :controller => 'events', :action => 'index' %>
<% end %>

修改app/views/events/edit.html.erb
<%= form_for @event, :url => event_path(@event), :method => :patch do |f| %>
    <%= render :partial => 'form', :locals => { :f => f } %>
    <%= f.submit "Update" %>
    <%= link_to 'Back to index', :controller => 'events', :action => 'index' %>
<% end %>

修改app/controllers/events_controller.rb,要修改的部份如下,藍色是原來的code,紅色是改變後的code
  def create
    @event = Event.new(event_params)
    if @event.save
      #redirect_to :action => :index
      redirect_to events_url
    else
      render :action => :new
    end
    flash[:notice] = "event was successfully created"
  end
  
  def update
    #@event = Event.find(params[:id])
    if @event.update(event_params)
      #redirect_to :action => :show, :id => @event
      redirect_to event_url(@event)
    else
      render :action => :edit
    end
    flash[:notice] = "event was successfully updated"
  end
  
  def destroy
    #@event = Event.find(params[:id])
    @event.destroy
  
    #redirect_to :action => :index
    redirect_to events_url
    flash[:alert] = "event was successfully deleted"
  end 

文章出處還有介紹其他xml、json的運用,大家可以玩玩看,因為這邊用不到所以就不多述了。

Cloud9-RoR-打造自己的CRUD

參考文章:https://ihower.tw/rails4/basic.html

CRUD:對資料庫做Create、Read、Update、Delete操作。

想要一步一步了解的人,可以照著參考文章練習,我只記錄檔案最後的樣子,以及要下的指令。

這個單元要建立的是一個類似Blog的功能,參考文章較像後台的樣子,所以就把它當成後台的建置唄。

產生一個Model
$ rails g model event cnttype:integer title:string description:text author:string is_public:boolean  public_date:date share:integer like:integer

執行指令建立資料表
$ bin/rake db:migrate

因為我是記錄正式站的建立步驟,所以直接跳到「實做基本的CRUD應用程式」,不過練習時還是所有乖乖把所有步驟都完成滴。

在config/routes.rb最後插入一行,這樣就不用每一條路徑都要進到routes.rb設定了
  # ....
  match ':controller(/:action(/:id(.:format)))', :via => :all
end

執行以下指令
$ rails g controller events

編輯app/controllers/events_controller.rb,灰字的部份是原來就存在檔案中的,我們要貼上的是綠色的部份
class EventsController < ApplicationController
  before_action :set_event, :only => [ :show, :edit, :update, :destroy]
  def index
    #@events = Event.all
    @events = Event.page(params[:page]).per(5)
  end
  
  def new
    @event = Event.new
  end
  def create
    @event = Event.new(event_params)
    if @event.save
      redirect_to :action => :index
    else
      render :action => :new
    end
    flash[:notice] = "event was successfully created"
  end
  
  def show
    #@event = Event.find(params[:id])
    @page_title = @event.title
  end
  
  def edit
    #@event = Event.find(params[:id])
  end
  def update
    #@event = Event.find(params[:id])
    if @event.update(event_params)
      redirect_to :action => :show, :id => @event
    else
      render :action => :edit
    end
    flash[:notice] = "event was successfully updated"
  end
  
  def destroy
    #@event = Event.find(params[:id])
    @event.destroy
  
    redirect_to :action => :index
    flash[:alert] = "event was successfully deleted"
  end
  
  #private以下的所有方法都會變成private方法,所以記得放在檔案的最底下。
  private
  
  def event_params
    params.require(:event).permit(:cnttype, :description, :author, :is_public, :public_date)
  end
  
  def set_event
    @event = Event.find(params[:id])
  end
end

Event.all會抓出所有的資料,回傳一個陣列給實例變數(instance variables)指派給@events。在Rails會讓Action裡的實例變數(也就是有@開頭的變數)通通傳到View樣板裡面可以使用。這個Action預設使用的樣板是app/views/events/目錄下與Action同名的檔案。

在app/view/s/events新增一個index.html.erb的檔案,內容如下
<ul>
<% @events.each do |event| %>
  <li>
    <%= event.title %>
  <%= link_to 'Show', :controller => 'events', :action => 'show', :id => event %>
  <%= link_to 'Edit', :controller => 'events', :action => 'edit', :id => event %>
  <%= link_to 'Delete', :controller => 'events', :action => 'destroy', :id => event %>
  </li>
<% end %>
</ul>
<%= link_to 'New Event', :controller => 'events', :action => 'new' %>
<%= paginate @events %>

新增app/views/events/new.html.erb檔案,內容如下
<%= form_for @event, :url => { :controller => 'events', :action => 'create' } do |f| %>
    <%= render :partial => 'form', :locals => { :f => f } %>

    <%= f.submit "Create" %>
    <%= link_to 'Back to index', :controller => 'events', :action => 'index' %>
<% end %>

新增app/views/events/show.html.erb檔案,內容如下
<%= @event.title %>
<table border="0">
  <tr>
    <td><%= @event.public_date %></td>
    <td><%= @event.author %></td>
  </tr>
</table>
<%= simple_format(@event.description) %>

<p><%= link_to 'Back to index', :controller => 'events', :action => 'index' %></p>

新增app/views/events/edit.html.erb檔案,內容如下
<%= form_for @event, :url => { :controller => 'events', :action => 'update', :id => @event } do |f| %>
    <%= render :partial => 'form', :locals => { :f => f } %>
    <%= f.submit "Update" %>
    <%= link_to 'Back to index', :controller => 'events', :action => 'index' %>
<% end %>

修改app/views/layouts/application.html.erb檔案中的<title>
<title><%= @page_title || "Event application" %></title>
show頁面的title會顯示活動名稱。其他頁面因為沒有設定@page_title,就會是「Event application」。

因為new.html.erb和edit.html.erb的內容都相同,所以我們做個局部樣板(Partial Template),新增app/views/events/_form.html.erb檔案,內容如下
<div>
<%= f.label :title, "文章" %>
<%= f.text_field :title, size: "50" %>
</div>
<div>
<%= f.label :cnttype, "類別" %>
<%= f.select(:cnttype, [['公益計畫', 1], ['案例平台', 2]]) %>
</div>
<div>
<%= f.label :author, "作者/出處" %>
<%= f.text_field :author, size: "30" %>
</div>
<div>
<%= f.text_area :description, size: "60x20"  %>
</div>
<div>
<%= f.label :public_date, "公開日" %>
<%= f.date_field :public_date %>
</div>
<div>
<%= f.check_box :is_public %>
<%= f.label :is_public, "草稿" %>
</div>
<div>
<% if @event.errors.any? %>
      <ul>
      <% @event.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
<% end %>
</div>
http://guides.rubyonrails.org/form_helpers.html,各種form元件的寫法。

指令處安裝分頁元件
$ gem install kaminari

安裝完成後,在Gemfile檔加上兩行
# page kaminari
gem 'kaminari'
分頁就能使用了。

這樣就做出基本的讀取、新增、修改、刪除功能溜!

2015年8月13日 星期四

Cloud9-RoR-mysql連結

https://docs.c9.io/docs/running-a-rails-app  本篇跟這份文件有關
開啟專案下的config/database.yml檔,將內容改成
development:
  adapter: mysql2
  encoding: utf8
  database: c9
  host: <%=ENV['IP']%>
  username: <%=ENV['C9_USER']%>
  password:
production:
  adapter: mysql2
  encoding: utf8
  database: c9
  host: <%=ENV['IP']%>
  username: <%=ENV['C9_USER']%>
  password:
test:
  adapter: mysql2
  encoding: utf8
  database: c9
  host: <%=ENV['IP']%>
  username: <%=ENV['C9_USER']%>
  password:

再打開專案下的Gemfile(就是這一步,我一直再想what is gemfile???),增加兩行
# Use mysql as the database for Active Record
gem 'mysql2'

接著在指令處下
gem install mysql2

安裝完成
Fetching: mysql2-0.3.19.gem (100%)
Building native extensions.  This could take a while...
Successfully installed mysql2-0.3.19
1 gem installed

Run程式啦
rails s -b $IP -p $PORT

畫面可以正常出現就代表完成啦!

在連線請先確定是不是裝好mysql,才不會鬼打牆。

Cloud9-RoR-rails與apache衝途

之前先裝phpmyadmin後run程式時會跑出這一大堆哩哩扣扣,然後失敗…
=> Booting WEBrick
=> Rails 4.2.1 application starting in development on http://0.0.0.0:8080
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-08-13 09:02:25] INFO  WEBrick 1.3.1
[2015-08-13 09:02:25] INFO  ruby 2.2.1 (2015-02-26) [x86_64-linux]
Exiting
/usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:206:in `bind': Address already in use - bind(2) for 0.0.0.0:8080 (Errno::EADDRINUSE)
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:206:in `listen'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:461:in `block in tcp_server_sockets'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:232:in `each'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:232:in `foreach'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:459:in `tcp_server_sockets'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/utils.rb:70:in `create_listeners'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/server.rb:133:in `listen'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/server.rb:114:in `initialize'
        from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:45:in `initialize'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/rack-1.6.1/lib/rack/handler/webrick.rb:32:in `new'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/rack-1.6.1/lib/rack/handler/webrick.rb:32:in `run'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/rack-1.6.1/lib/rack/server.rb:286:in `start'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.1/lib/rails/commands/server.rb:80:in `start'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:80:in `block in server'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:75:in `tap'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:75:in `server'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.1/lib/rails/commands.rb:17:in `<top (required)>'
        from /home/ubuntu/workspace/bin/rails:8:in `require'
        from /home/ubuntu/workspace/bin/rails:8:in `<top (required)>'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.3.6/lib/spring/client/rails.rb:28:in `load'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.3.6/lib/spring/client/rails.rb:28:in `call'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.3.6/lib/spring/client/command.rb:7:in `call'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.3.6/lib/spring/client.rb:26:in `run'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.3.6/bin/spring:48:in `<top (required)>'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.3.6/lib/spring/binstub.rb:11:in `load'
        from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.3.6/lib/spring/binstub.rb:11:in `<top (required)>'
        from /home/ubuntu/workspace/bin/spring:13:in `require'
        from /home/ubuntu/workspace/bin/spring:13:in `<top (required)>'
        from bin/rails:3:in `load'
        from bin/rails:3:in `<main>'

google了好久,終於在一個網站上發現解決之道(話說這個網站真的很好用,每次遇到問題幾乎都是在這個網站上找到解答滴)

http://stackoverflow.com/questions/26663967/rails-tutorial-chapter-1-rails-server-isnt-working-on-cloud9  原始網頁

下指令
lsof -i:8080

出現
COMMAND   PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
apache2 15456 ubuntu    4u  IPv6 743515391      0t0  TCP *:http-alt (LISTEN)
apache2 15462 ubuntu    4u  IPv6 743515391      0t0  TCP *:http-alt (LISTEN)
apache2 15463 ubuntu    4u  IPv6 743515391      0t0  TCP *:http-alt (LISTEN)
apache2 15464 ubuntu    4u  IPv6 743515391      0t0  TCP *:http-alt (LISTEN)
apache2 15465 ubuntu    4u  IPv6 743515391      0t0  TCP *:http-alt (LISTEN)
apache2 15466 ubuntu    4u  IPv6 743515391      0t0  TCP *:http-alt (LISTEN)
apache2 17350 ubuntu    4u  IPv6 743515391      0t0  TCP *:http-alt (LISTEN)

原來是apach佔了8080port啊啊啊啊啊啊...所以停止它!
sudo /etc/init.d/apache2 stop

終於跑出頁面來了,可喜可賀~可喜可賀!
這問題搞了我一天,眼睛太用力的盯著螢幕,不酥湖,休息準備下班企…

2015年8月11日 星期二

Cloud9-RoR-phpmyadmin安裝

mysql的好朋友phpmyadmin。

https://docs.c9.io/docs/setting-up-phpmyadmin 官網文件

影片字很小又講很快。

指令:

$ phpmyadmin-ctl install

再次確認mysql為啟動中

$ mysql-ctl start

安裝完phpmyadmin後有一行很重要

PHPMyAdmin Installation complete. You can log in at: https://專案-帳號-1.c9.io/phpmyadmin with the following username (and blank password):

https://專案-帳號-1.c9.io/phpmyadmin

這個就是phpmyadmin的連結,直接點選連結就行哩,BTW,一開始是沒有預設密碼的。



Cloud9-RoR-mysql安裝篇

在Cloud9的視窗下方,有個「bash-帳號-專案-不知名編號」的視窗,輸入下方連結的指令

https://docs.c9.io/docs/setup-a-database 官網提供的文件


安裝mysql

$ mysql-ctl install

不過本來就有安裝了,所以會先stop然後在starting,然後秀出

MySQL 5.5 database added.  Please make note of these credentials:

Root User: username
Database Name: c9

mysql的使用ip是127.0.0.1,port則是3306。

控制mysql

$ mysql-ctl cli
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 24
Server version: 5.5.37-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>  show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| c9                 |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.15 sec)

接著就是安裝phpmyadmin了,下一篇唄。(先不做,apache會與rails衝途)