iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 28
2

應觀眾要求,今天我們作一個管理後台,讓我們可以在網頁上管理關鍵字。

在開始之前,先大概說明一下今天要學習的範圍有哪些:

  • 網頁的呈現需要使用 HTML 和 CSS
  • 既然是後台,就要作登入功能

我們作的網站到目前為止沒有碰過任何的 HTML 和 CSS,突然要寫個管理後台也許會很吃力。不過還好是作後台,不需要多美觀。

使用產生器製作後台

幸好 Rails 有一個內建指令直接生成網頁,不一定要自己寫。

指令是 rails generate scaffold 資料模型名稱 和欄位們

rails g scaffold keyword_mapping channel_id keyword message --skip

後面的 --skip 是指定當發生衝突時應該略過。衝突的意思是指 rails 想新增一個檔案,剛好在目錄裡已經有個同名的檔案。

D:\只要有心,人人都可以作卡米狗\ironman>rails g scaffold keyword_mapping channel_id keyword message --skip
      invoke  active_record
        skip    db/migrate/20180115144538_create_keyword_mappings.rb
   identical    app/models/keyword_mapping.rb
      invoke    test_unit
   identical      test/models/keyword_mapping_test.rb
        skip      test/fixtures/keyword_mappings.yml
      invoke  resource_route
       route    resources :keyword_mappings
      invoke  scaffold_controller
      create    app/controllers/keyword_mappings_controller.rb
      invoke    erb
      create      app/views/keyword_mappings
      create      app/views/keyword_mappings/index.html.erb
      create      app/views/keyword_mappings/edit.html.erb
      create      app/views/keyword_mappings/show.html.erb
      create      app/views/keyword_mappings/new.html.erb
      create      app/views/keyword_mappings/_form.html.erb
      invoke    test_unit
      create      test/controllers/keyword_mappings_controller_test.rb
      invoke    helper
      create      app/helpers/keyword_mappings_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/keyword_mappings/index.json.jbuilder
      create      app/views/keyword_mappings/show.json.jbuilder
      create      app/views/keyword_mappings/_keyword_mapping.json.jbuilder
      invoke  test_unit
      create    test/system/keyword_mappings_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/keyword_mappings.coffee
      invoke    scss
      create      app/assets/stylesheets/keyword_mappings.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

D:\只要有心,人人都可以作卡米狗\ironman>

以下說明到底生成了什麼東西。

生成 Routes

他會在 config/routes.rb 生成一個 resource:

resources :keyword_mappings

這是資源(resource),提供一個資源的存取所需要的網址和 Controller 的對應。

這行會生成 8 組網址與 7 個 Controller Action 的對應,可以使用 rails routes 觀察:

D:\只要有心,人人都可以作卡米狗\ironman>rails routes
                 Prefix Verb   URI Pattern                          Controller#Action
       keyword_mappings GET    /keyword_mappings(.:format)          keyword_mappings#index
                        POST   /keyword_mappings(.:format)          keyword_mappings#create
    new_keyword_mapping GET    /keyword_mappings/new(.:format)      keyword_mappings#new
   edit_keyword_mapping GET    /keyword_mappings/:id/edit(.:format) keyword_mappings#edit
        keyword_mapping GET    /keyword_mappings/:id(.:format)      keyword_mappings#show
                        PATCH  /keyword_mappings/:id(.:format)      keyword_mappings#update
                        PUT    /keyword_mappings/:id(.:format)      keyword_mappings#update
                        DELETE /keyword_mappings/:id(.:format)      keyword_mappings#destroy
             kamigo_eat GET    /kamigo/eat(.:format)                kamigo#eat
 kamigo_request_headers GET    /kamigo/request_headers(.:format)    kamigo#request_headers
    kamigo_request_body GET    /kamigo/request_body(.:format)       kamigo#request_body
kamigo_response_headers GET    /kamigo/response_headers(.:format)   kamigo#response_headers
   kamigo_response_body GET    /kamigo/response_body(.:format)      kamigo#show_response_body
    kamigo_sent_request GET    /kamigo/sent_request(.:format)       kamigo#sent_request
         kamigo_webhook POST   /kamigo/webhook(.:format)            kamigo#webhook

7 個 Action 分別為 index, create, new, edit, show, update, destroy,接下來說明各個 Action 的功能:

以下屬於 GET request,這些都是網頁:

  • index:列表頁
  • new:新增資料頁
  • show:檢視資料頁
  • edit:編輯資料頁

以下非 GET request,都是請求資料變更:

  • create:請求新增資料
  • update:請求更新資料
  • destroy:請求刪除資料

生成 Controller

生成了一個 Controller 在:app/controllers/keyword_mappings_controller.rb。7 個對應的 Action 都寫好了,這裡就不多介紹。

生成 View

生成了一整個資料夾的 View,其中最重要的 4 個:

app/views/keyword_mappings/index.html.erb
app/views/keyword_mappings/edit.html.erb
app/views/keyword_mappings/show.html.erb
app/views/keyword_mappings/new.html.erb

這就是那些 GET request 會用到的網頁檔,也都寫好了。

實測

既然都寫好了就來試用看看,先執行網頁伺服器:

rails s

然後開啟網頁 http://localhost:3000/keyword_mappings

index 列表頁

new 新增資料頁

隨便亂填:

show 檢視資料頁

所以其實不考慮美觀性的話,其實後台只要一個指令就完成了。

建立登入功能

使用知名套件 devise 來作。

我相信現在的你如果沒有英文閱讀障礙,應該已經能看懂這個使用說明

總而言之先在 Gemfile 加這行:

gem 'devise'

然後在小黑框打 bundle install 安裝套件。

裝好之後使用 devise 提供的產生器指令進行初始化: rails generate devise:install

D:\只要有心,人人都可以作卡米狗\ironman>rails generate devise:install
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

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

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

===============================================================================

D:\只要有心,人人都可以作卡米狗\ironman>

他說有幾個步驟產生器沒搞頭,必須手動進行。我們先不管他,等到真正出問題再回頭來解決。

使用產生器產生用戶資料模型:

rails generate devise user
D:\只要有心,人人都可以作卡米狗\ironman>rails generate devise user
      invoke  active_record
      create    db/migrate/20180115152537_devise_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      insert    app/models/user.rb
       route  devise_for :users

D:\只要有心,人人都可以作卡米狗\ironman>

跟剛剛的 scaffold 差不多,該生的都生好了。

註冊頁:http://localhost:3000/users/sign_up
登入頁:http://localhost:3000/users/sign_in

關閉註冊功能

我們要將註冊功能關閉,如果大家都能註冊,那還要後台幹嘛?

app/models/user.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

刪除 :registerable,

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable,
         :recoverable, :rememberable, :trackable, :validatable
end

登入後才能管理關鍵字

我們希望只有登入後的人才能進入管理關鍵字的頁面。

app/controllers/keyword_mappings_controller.rb 加入:

before_action :authenticate_user!

看起來像這樣:

class KeywordMappingsController < ApplicationController
  before_action :authenticate_user!
  before_action :set_keyword_mapping, only: [:show, :edit, :update, :destroy]

  ...下略

這時候開啟網址:http://localhost:3000/keyword_mappings,就會因為尚未登入,而被引導至登入頁。

發布流程

  • 上傳程式碼
  • Heroku 上的資料庫遷移

關閉了註冊功能後要怎麼新增自己的帳號?

使用 rails console 連上去新增帳號:

heroku run rails console

連上後會是 rails console 的樣子:

D:\只要有心,人人都可以作卡米狗\ironman>heroku run rails console
Running rails console on people-all-love-kamigo... up, run.2165 (Free)
Loading production environment (Rails 5.1.4)
irb(main):001:0>

寫一行程式碼新增資料:

User.create(email:'kamigo.service@gmail.com', password:'kamigo')

會有一些 SQL 的訊息:

irb(main):001:0> User.create(email:'kamigo.service@gmail.com', password:'kamigo')
D, [2018-01-15T15:42:28.307402 #4] DEBUG -- :    (6.0ms)  BEGIN
D, [2018-01-15T15:42:28.313291 #4] DEBUG -- :   User Exists (2.1ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "kamigo.service@gmail.com"], ["LIMIT", 1]]
D, [2018-01-15T15:42:28.317361 #4] DEBUG -- :   SQL (1.9ms)  INSERT INTO "users" ("email", "encrypted_password", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["email", "kamigo.service@gmail.com"], ["encrypted_password", "$2a$11$EyR.yuDYI3J2s9/Q8Etk5evQzsz2bGAPdvdcr.xmFQbzYbBPQk/kK"], ["created_at", "2018-01-15 15:42:28.313883"], ["updated_at", "2018-01-15 15:42:28.313883"]]
D, [2018-01-15T15:42:28.320139 #4] DEBUG -- :    (2.0ms)  COMMIT
=> #<User id: 1, email: "kamigo.service@gmail.com", created_at: "2018-01-15 15:42:28", updated_at: "2018-01-15 15:42:28">
irb(main):002:0>

看到倒數第二行:

=> #<User id: 1, email: "kamigo.service@gmail.com", created_at: "2018-01-15 15:42:28", updated_at: "2018-01-15 15:42:28">

就表示建立好帳號了。

線上實測

https://people-all-love-kamigo.herokuapp.com/keyword_mappings

大家可以用我的帳號登入看看。

帳號:kamigo.service@gmail.com
密碼:kamigo

本日重點

  • 學會使用 scaffold
  • 學會作登入系統

你們可以透過閱讀 scaffold 產生出來的程式碼來學習 HTML 和 Controller Action 的寫法。這跟學英文一樣,看到不懂的單字就 Google,這單字量還比英文少超多,大概 100~200 個字而已。

明天講怎麼發公告。


上一篇
第二十七天:卡米狗見人說人話,見鬼說鬼話
下一篇
第二十九天:卡米狗發公告
系列文
只要有心,人人都可以做卡米狗33
0
jerryw47
iT邦新手 5 級 ‧ 2018-01-16 12:08:09

請問一下,這個是照你上面打嗎?
https://ithelp.ithome.com.tw/upload/images/20180116/20107956aopajKHqUm.png
因為我想要新增自己的,結果出現以下這樣
https://ithelp.ithome.com.tw/upload/images/20180116/20107956ZIuiKQOoNC.png

你還沒有上傳程式碼吧

nienst iT邦新手 5 級‧ 2018-01-27 16:48:43 檢舉

我剛剛也遇到一樣的問題
後來發現我程式碼放錯地方
在 app/controllers/keyword_mappings_controller.rb 加入

before_action :authenticate_user!

我卻不小心加在
app/models/user.rb

2
luke90329
iT邦新手 5 級 ‧ 2018-01-16 18:22:11

卡米大我照上面弄到執行時 出現了這個錯誤@@
https://ithelp.ithome.com.tw/upload/images/20180116/20107961P8PpQBhgk9.png

看更多先前的回應...收起先前的回應...

最後是把app/views/layouts/application.html.erb 的"檔名"
改成 app/views/layouts/default.html.erb
才解決 不過應該也是治標不治本
詳細的方法在:https://stackoverflow.com/questions/12520456/execjsruntimeerror-on-windows-trying-to-follow-rubytutorial

不過destroy沒甚麼反應就是了....

https://ithelp.ithome.com.tw/upload/images/20180116/20107961r82tm4Hxdq.png
然後又出現了這個問題 可是把資料庫遷移過一次還是一樣

我看了那篇文章,我覺得裝 node.js 可能比較好

結果我先把app\assets\javascripts\application.js裡面最下面的

//= require_tree .

刪掉就好了

不過為了保險起見還是裝個node.js好了

不過資料庫的問題依然存在 查了Devise的status是down
不過在heroku上是正常 看來又是windows的問題了

XD

我的錯誤畫面也一樣QQ

樓上裝 node.js 有用嗎

卡米大雖然這個在heroku上面沒問題 不過我還是想解決xD
https://ithelp.ithome.com.tw/upload/images/20180118/20107961tEeQbH25nX.png
後來找了一下錯誤訊息是這個 應該就是因為他沒有成功遷移才造成keyword_mapping整個掛掉(要先登入)

可以看一下你的 db/migrate 資料夾內的檔案列表嗎?

https://ithelp.ithome.com.tw/upload/images/20180119/20107961Qq80cwb7Ye.png

試試

rails db:drop
rails db:create
rails db:migrate

還是不行@@ 這兩個一直都是down
bundle exec rake db:migrate也試過了

0.0

好吧 看來可能是建置的時候有哪邊做錯了
不過還有一個問題 就是我想在天氣圖片前發送一個純文字訊息

  #查天氣指令
  def get_weather(received_text)
    return nil unless received_text.include? '天氣'
    upload_to_imgur(get_weather_from_cwb)
    push_messages = get_time_from_cwb
    push_to_line(channel_id, push_messages)
  end

  #取得最新雷達回波圖
  def get_weather_from_cwb
    uri = URI('http://www.cwb.gov.tw/V7/js/HDRadar_1000_n_val.js')
    response = Net::HTTP.get(uri)
    start_index = response.index('","') + 3
    end_index = response.index('"),') - 1
    "http://www.cwb.gov.tw" + response[start_index..end_index]
  end

  #取得最新雷達回波圖時間
  def get_time_from_cwb
    uri = URI('http://www.cwb.gov.tw/V7/js/HDRadar_1000_n_val.js')
    response = Net::HTTP.get(uri)
    time_start_index = response.index('("') +2
    time_end_index = response.index('","') -1
    "雷達回波圖:" + response[time_start_index..time_end_index]
  end

可是怎麼試都同時只會有訊息或圖片出去而已 很疑惑的是一個是reply一個是push應該不會衝突阿

安裝這個:http://sqlitebrowser.org/

然後讀取 db/development.sqlite3 這個檔案

截這個畫面貼上來:
https://ithelp.ithome.com.tw/upload/images/20180119/201073096HvAq0GhDY.jpg

回應訊息其實可以傳陣列喔,只是要改原本的 code 我就懶了 XD

# 設定回覆訊息
    image_message = {
      type: "image",
      originalContentUrl: reply_image,
      previewImageUrl: reply_image
    }
    text_message = {
      type: 'text',
      text: reply_text
    }
line.reply_message(reply_token, [text_message, image_message])

像這樣是可以的。

https://ithelp.ithome.com.tw/upload/images/20180119/20107961WWHE1Uo8VB.png

額 漏了這個沒回應到
從這張圖片來看,你的資料庫裡面已經存在 users 表格,但是你說你的 migration 還沒做完,真的是怪怪的。

可以看一下 rails db:migrate:status 會出現什麼嗎?

https://ithelp.ithome.com.tw/upload/images/20180126/20107961asDtDLkuOG.png

哇 多一個 no file 應該就是這裡出了問題。

那有甚麼指令可以把它刪除的嗎@@

我好像知道錯誤在哪裡了 因為我之前先照著教學做了一次可是出現了第一個錯誤 然後我就把文件都先刪掉重新做一次 所以後來新的遷移檔才會出問題 可是要怎麼把已經在資料庫內的資料刪掉呢 用db browser就可以了嗎

rails db:drop
rails db:create
rails db:migrate
tarzan iT邦新手 5 級‧ 2018-02-25 17:10:39 檢舉

那個ExecJS::ProgramError,我裝了Node.js,再重開PC後,未改任何檔名或程式,就解決了。

0
lee98064
iT邦新手 5 級 ‧ 2018-01-16 19:21:06

想請問大大,剛剛做到這個步驟時(然後開啟網頁 http://localhost:3000/keyword_mappings)
卻出現以下錯誤,想請問一下要怎麼解決
完整錯誤訊息:
https://drive.google.com/open?id=1pATrDNWjpxCupp3RL02fW0_LEXhj45ksmrW-KTjk4ZU

https://ithelp.ithome.com.tw/upload/images/20180116/201083253aJhXhL51p.png

看更多先前的回應...收起先前的回應...

他說:你要先執行 rails db:migrate

執行了還是出現耶???

試試看 rails db:migrate:status 會顯示什麼?

謝謝卡米大~/images/emoticon/emoticon37.gif
我後來直接上傳heroku就正常了XDDD
然後想再問一個問題就是使用者帳號可以建立多組嗎?

可以

0
ray19990613
iT邦新手 5 級 ‧ 2018-01-17 01:07:00

卡卡米你好~
我也失敗了,
我的可以正常顯示註冊、登入畫面,
但是按下註冊、登入按鈕後,
會顯示下列錯誤訊息 QAQ

https://ithelp.ithome.com.tw/upload/images/20180117/20108327zjyMOkP6hn.png

看更多先前的回應...收起先前的回應...

嗯,我剛剛也有看到這個錯誤訊息,但是在 heroku 上是好的,所以應該是 windows 的問題,我還沒找到怎麼解。

關於 Rails - Windows 上會遇到的 LoadError (cannot load such file -- bcrypt_ext)

什麼時候會遇到這個問題?

當你使用任何需要加密功能的套件時,比方說 Devise。

成因

安裝了不能在 windows 下正常執行的 bcrypt 套件。

解法

先解除安裝所有 bcrypt

gem uninstall bcrypt-ruby
gem uninstall bcrypt

再安裝正確版本

gem install bcrypt --platform=ruby

你的 Gemfile 應該加入這行

gem 'bcrypt', '~> 3.1.11'

參考連結

https://github.com/codahale/bcrypt-ruby/issues/142#issuecomment-291345799

我也是卡在這邊.... 可是加入了gem 'bcrypt', '~> 3.1.11' 之後網頁反而開不起來

https://ithelp.ithome.com.tw/upload/images/20180121/201062506QWUxdhOHq.png

卡卡米

gem uninstall bcrypt-ruby
gem uninstall bcrypt

這兩個跑過沒問題

gem install bcrypt --platform=ruby

這個就會出現紅字失敗

失敗的訊息是什麼呢?

你的 Gemfile 裡面寫了什麼?

我後來是這樣成功的

先在 Gemfile 加入這一行
gem 'bcrypt', platforms: :ruby

然後再到小黑框依序輸入這些指令
gem uninstall bcrypt-ruby
gem uninstall bcrypt
gem install bcrypt --platform=ruby

這樣應該就可以了,
試試看吧 :)

這是在加入 before_action :authenticate_user! 前可以行得通,
加入後就又會一直出現跟樓上一樣的錯誤訊息,
https://ithelp.ithome.com.tw/upload/images/20180124/20108327RlOpH6rkVR.jpg
不過在 heroku 是可以正常執行的 :)

/images/emoticon/emoticon06.gif

0
nienst
iT邦新手 5 級 ‧ 2018-02-08 19:51:20

我想如法炮製,做一個 頻道 管理後台.... 卻做不出來 @@"
應該是下這樣的一行指令,一步接一步 就能成功了呀
(有一些錯誤有點眼熟,還沒查出來...)
rails g scaffold channel channel_id --skip

C:\Users\Nien\Desktop\粘粘的卡米狗\ironman>rails g scaffold channel channel_id -
-skip
invoke active_record
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/thor-0.20.0/lib/thor/actions.rb:117:in g sub!': incompatible character encodings: UTF-8 and CP950 (Encoding::Compatibilit yError) from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/thor-0.20.0/lib/thor/actions .rb:117:inrelative_to_original_destination_root'
from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/gen
erators/actions/create_migration.rb:29:in relative_existing_migration' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/gen erators/actions/create_migration.rb:45:inon_conflict_behavior'
from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/thor-0.20.0/lib/thor/actions
/empty_directory.rb:115:in invoke_with_conflict_check' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/thor-0.20.0/lib/thor/actions /create_file.rb:60:ininvoke!'
from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/thor-0.20.0/lib/thor/actions
.rb:94:in action' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/gen erators/migration.rb:34:increate_migration'
from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/gen
erators/migration.rb:63:in migration_template' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/activerecord-5.1.4/lib/rails /generators/active_record/model/model_generator.rb:20:increate_migration_file'
(... 下略 ...)

看更多先前的回應...收起先前的回應...

雖然這樣有點怪怪der 但你試試看把黏黏的卡米狗 資料夾名稱改成英文之後再試試看

nienst iT邦新手 5 級‧ 2018-02-09 01:02:14 檢舉

恩恩 我明天測試看看
感恩卡米 讚嘆卡米

nienst iT邦新手 5 級‧ 2018-02-09 18:53:19 檢舉

感恩卡米 讚嘆卡米

竟然真的就這樣成功了~~~ 感動到忍不住想哭~~ ㄎㄎ
因為我嘗試了很多的方法... 都看不出哪邊編碼有問題....不斷的在前幾篇的編碼來回查看
昨天看到您的回覆其實本來也半信半疑(現在想想我真的很不應該有這樣的想法)
因為我之前也是用中文,也都可以

總之,非常感謝卡米大師~~~ 讓卡關多天的我,終於成功了~~

我也覺得用中文應該要可以 QQ

nienst iT邦新手 5 級‧ 2018-02-10 10:55:51 檢舉

恩 也許我有動到什麼設定 導致後來不可以
因此我也沒想到 會是資料夾 中文 編碼問題
我英文不是很好 用GOOGLE翻譯 只知道是編碼問題
呵呵 還是卡米大師厲害

感恩卡米 讚嘆卡米

1
tarzan
iT邦新手 5 級 ‧ 2018-02-25 23:07:49

https://ithelp.ithome.com.tw/upload/images/20180225/20108630sLJJXnKNc8.jpg
請問:執行 rails generate devise:install 出現如圖錯誤訊息,怎麼解?

看更多先前的回應...收起先前的回應...

如果你的專案資料夾路徑含有中文,改成英文之後再試試看

tarzan iT邦新手 5 級‧ 2018-02-26 23:58:00 檢舉

資料夾改英文之後, rails generate devise:install 過了。
感謝

tarzan iT邦新手 5 級‧ 2018-02-27 00:08:52 檢舉

https://ithelp.ithome.com.tw/upload/images/20180227/20108630K3XSoWMlOh.jpg
請問上面這個指令因為是重複作了,所以 db/migrate/<一串數字>add.....
這個檔名多了"add",而且少了下圖的幾行程式,這樣子程式會有問題嗎?
https://ithelp.ithome.com.tw/upload/images/20180227/20108630I1MB3wy2CO.jpg

tarzan iT邦新手 5 級‧ 2018-02-27 00:44:52 檢舉

直接去網頁 http://localhost:3000/users/sigh_up 出現下圖錯誤:
https://ithelp.ithome.com.tw/upload/images/20180227/20108630WpxyHJWV1P.jpg
https://ithelp.ithome.com.tw/upload/images/20180227/20108630vCP3LJANP2.jpg

然後我照上面幾位大大的Q&A,作了 rails db:migrate,出現下圖錯誤,我是不是把他搞亂了?

tarzan iT邦新手 5 級‧ 2018-02-27 00:45:38 檢舉

忘記放圖...
https://ithelp.ithome.com.tw/upload/images/20180227/20108630lYxkIV2xos.jpg

對的,你要把多餘的 migration 檔案刪掉,然後下這些指令

rails db:drop
rails db:create
rails db:migrate
tarzan iT邦新手 5 級‧ 2018-02-28 00:39:25 檢舉

刪掉有"add"的migration檔案後,執行rails db:drop,出現下圖錯誤:
https://ithelp.ithome.com.tw/upload/images/20180228/20108630p2QMYqaluJ.jpg

下圖中的 20180225093653_devise_create_users.rb 這個檔也要刪嗎?
https://ithelp.ithome.com.tw/upload/images/20180228/20108630dlavNHQhie.jpg

看起來是這個小黑框沒有權限刪除資料庫 你可以手動刪除那個 .sqlite3 檔案,然後跳過 rails db:drop 指令,執行後面的那些

tarzan iT邦新手 5 級‧ 2018-02-28 02:33:23 檢舉

謝謝米大耐心指導,卡了3天終於正常!

請教一下卡米大 我在初始化rails generate devise:install 和 產生用戶模型 rails generate devise user 這邊都正常執行。

可是開啟網頁也跟上面出現同樣的畫面 參考了大家的Q&A 也手動刪除 .sqlite3 檔案 去跳過 rails db:drop 指令執行後面的指令。
不過只要執行指令 那些.sqlite3 檔案就會自行產生出來... 這樣是正確的嗎 ?
https://ithelp.ithome.com.tw/upload/images/20180413/201094834Jdvzav0Ay.png

我的status狀態也 沒有 NO FILE 可是ADD device一直都是down的狀態

https://ithelp.ithome.com.tw/upload/images/20180413/20109483ISA3Ln3Idn.png

我重新再做一次就成功解決了.. (?)

0.0

0
tarzan
iT邦新手 5 級 ‧ 2018-02-28 23:34:57

我把程式上傳,在heroku run rails console 下,執行 User.create 指令後,出現下圖錯誤:
https://ithelp.ithome.com.tw/upload/images/20180228/20108630HJdqsOH0Id.jpg

在 Heroku 上的資料庫遷移

heroku run rake db:migrate

如果你已經跑了資料庫遷移程式,但他還是找不到新欄位的話,可以試試看重開 heroku server:

heroku restart
tarzan iT邦新手 5 級‧ 2018-03-01 01:41:57 檢舉

謝謝您,執行完 migrate 就成功了。
請教:在後台管理想作個登出的功能?

找一個地方放超連結 連到 /users/sign_out 就可以囉

0
魷魚
iT邦新手 2 級 ‧ 2018-03-01 08:25:37

你好,最近終於有空繼續實作卡米狗了,但在操作完「生成 View」後打開rails s,跑出以下圖示。
https://ithelp.ithome.com.tw/upload/images/20180301/20103350dIERyqNyba.jpg

看起來是要我執行rails db:migrate,執行後如下圖。
https://ithelp.ithome.com.tw/upload/images/20180301/20103350BsbKqEmiJz.jpg

好像多了一個NO FILE和叫我去看add_channel_id_to_keyword_reply.rb,打開如下圖。
https://ithelp.ithome.com.tw/upload/images/20180301/201033500hSTnFlIb6.jpg

另外補上ironman\db\migrate的資料夾圖示,再麻煩卡米大了,謝謝。
https://ithelp.ithome.com.tw/upload/images/20180301/20103350arJS0QuZds.jpg

tarzan iT邦新手 5 級‧ 2018-03-01 19:22:14 檢舉

請參考上面我 2/27 問的狀況,和您的狀況相似,卡米大有解答了。

0
tarzan
iT邦新手 5 級 ‧ 2018-03-02 00:51:12

卡米大,再請教一個問題:
如果想讓相同 keyword 的不同 message 隨機回覆,是不是把
KeywordMapping.where(keyword: received_text).last&.message 這裏的 last 改成 random?

tarzan iT邦新手 5 級‧ 2018-03-02 02:14:56 檢舉

good~

0
curry_sun
iT邦新手 5 級 ‧ 2018-03-15 16:36:36

做到最後一個步驟也上傳heroku跟跑過資料庫
結果要新增User的資料出現這樣的錯誤了0.0

https://ithelp.ithome.com.tw/upload/images/20180315/20108525lQhOSkBPSQ.png

看起來是 server 上面的程式碼是舊的。

感謝你這麼快速回應,後來我找到問題了
要先把程式碼pull下來之後再push上去,就正常運行了 :)

/images/emoticon/emoticon12.gif

0
king1761
iT邦新手 5 級 ‧ 2018-04-13 13:55:29

卡米大 再請教一下 ..
我git 在push的時候一直push不上去 的問題該如何解決呢 QAQ/images/emoticon/emoticon06.gif

https://ithelp.ithome.com.tw/upload/images/20180413/20109483vCtDKLcFzd.png

https://ithelp.ithome.com.tw/upload/images/20180413/20109483PagJVra0Ss.png

不確定為什麼你會遇到這個問題,但解法應該是 打開 config/initializers/devise.rb

找到第11行 把最前面的 # 刪掉就好了

0
jeep1014
iT邦新手 5 級 ‧ 2018-05-15 17:45:07

卡米大你好,請教一下,
我也在git push的時候push不上去,也試過"打開 config/initializers/devise.rb 找到第11行 把最前面的 # 刪掉" 的方式,也試過退回記得曾經改過的code,但是始終無法恢復正常:
(我還沒做註冊和新增帳號功能)

-----> Ruby app detected
-----> Compiling Ruby/Rails
-----> Using Ruby version: ruby-2.4.4

WARNING:
   Removing `Gemfile.lock` because it was generated on Windows.
   Bundler will do a full resolve so native gems are handled properly.
   This may result in unexpected gem versions being used in your app.
   In rare occasions Bundler may not be able to resolve your dependencies at all.
   https://devcenter.heroku.com/articles/bundler-windows-gemfile

-----> Installing dependencies using bundler 1.15.2
Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java.
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Using rake 12.3.1
Using concurrent-ruby 1.0.5
Using minitest 5.11.3
Using thread_safe 0.3.6
Using builder 3.2.3
Using erubi 1.7.1
Using mini_portile2 2.3.0
Using crass 1.0.4
Using rack 2.0.5
Using nio4r 2.3.1
Using websocket-extensions 0.1.3
Using mini_mime 1.0.0
Using arel 9.0.0
Using mimemagic 0.3.2
Fetching bcrypt 3.1.11
Using msgpack 1.2.4
Using bundler 1.15.2
Using coffee-script-source 1.12.2
Using execjs 2.7.0
Using method_source 0.9.0
Using thor 0.20.0
Fetching orm_adapter 0.5.0
Using duktape 1.6.1.0
Using ffi 1.9.23
Using multi_json 1.13.1
Using line-bot-api 1.2.2
Using pg 0.21.0
Using puma 3.11.4
Using rb-fsevent 0.10.3
Using tilt 2.0.8
Using turbolinks-source 5.1.0
Using tzinfo 1.2.5
Using nokogiri 1.8.2
Using rack-test 1.0.0
Fetching warden 1.2.7
Installing orm_adapter 0.5.0
Installing bcrypt 3.1.11 with native extensions
Installing warden 1.2.7
Using i18n 1.0.1
Using sprockets 3.7.1
Using websocket-driver 0.7.0
Using mail 2.7.0
Using marcel 0.3.2
Using bootsnap 1.3.0
Using coffee-script 2.4.1
Using uglifier 4.1.10
Using rb-inotify 0.9.10
Using turbolinks 5.1.1
Using loofah 2.2.2
Using activesupport 5.2.0
Using sass-listen 4.0.0
Using rails-html-sanitizer 1.0.4
Using rails-dom-testing 2.0.3
Using globalid 0.4.1
Using activemodel 5.2.0
Using jbuilder 2.7.0
Using sass 3.5.6
Using actionview 5.2.0
Using activejob 5.2.0
Using activerecord 5.2.0
Using actionpack 5.2.0
Using actioncable 5.2.0
Using actionmailer 5.2.0
Using activestorage 5.2.0
Using railties 5.2.0
Using sprockets-rails 3.2.1
Using coffee-rails 4.2.2
Fetching responders 2.4.0
Using rails 5.2.0
Using sass-rails 5.0.7
Installing responders 2.4.0
Fetching devise 4.4.3
Installing devise 4.4.3
Bundle complete! 17 Gemfile dependencies, 68 gems now installed.
Gems in the groups development and test were not installed.
Bundled gems are installed into ./vendor/bundle.
Bundle completed (4.84s)
Cleaning up the bundler cache.
The latest bundler is 1.16.1, but you are currently running 1.15.2.
To update, run gem install bundler
-----> Installing node-v8.10.0-linux-x64
-----> Detecting rake tasks
-----> Preparing app for Rails asset pipeline
Running: rake assets:precompile
rake aborted!
ArgumentError: '' is not a supported controller name. This can lead to potential routing problems. See http://guides.rubyonrails.org/routing.html#specifying-a-controller-to-use
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:314:in block (2 levels) in check_controller_and_action' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:359:intranslate_controller'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:310:in block in check_controller_and_action' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:325:incheck_part'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:309:in check_controller_and_action' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:254:innormalize_options!'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:118:in initialize' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:71:innew'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:71:in build' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:1931:inadd_route'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:1903:in decomposed_match' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:1867:inblock in map_match'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:1861:in each' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:1861:inmap_match'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:1609:in match' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:742:inmap_method'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/mapper.rb:703:in get' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/config/routes.rb:12:inblock in '
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/route_set.rb:432:in instance_exec' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/route_set.rb:432:ineval_block'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/actionpack-5.2.0/lib/action_dispatch/routing/route_set.rb:414:in draw' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/config/routes.rb:1:in'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:50:in load' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:50:inload'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:277:in block in load' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:249:inload_dependency'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:277:in load' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application/routes_reloader.rb:57:inblock in load_paths'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application/routes_reloader.rb:57:in each' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application/routes_reloader.rb:57:inload_paths'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application/routes_reloader.rb:20:in reload!' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application/routes_reloader.rb:43:inblock in updater'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/activesupport-5.2.0/lib/active_support/file_update_checker.rb:83:in execute' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application/routes_reloader.rb:44:inupdater'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application/routes_reloader.rb:33:in execute_if_updated' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application/finisher.rb:130:inblock in <module:Finisher>'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:32:in instance_exec' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:32:inrun'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:61:in block in run_initializers' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:60:inrun_initializers'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application.rb:361:in initialize!' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/config/environment.rb:5:in'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in require' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:inblock in require_with_bootsnap_lfi'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in register' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:inrequire_with_bootsnap_lfi'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in require' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:inblock in require'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:249:in load_dependency' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:inrequire'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application.rb:337:in require_environment!' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/railties-5.2.0/lib/rails/application.rb:520:inblock in run_tasks_blocks'
/tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:62:in block (2 levels) in define' /tmp/build_f3b8f23fcf280a21610d705d694a6f98/vendor/bundle/ruby/2.4.0/gems/rake-12.3.1/exe/rake:27:in<top (required)>'
Tasks: TOP => environment
(See full trace by running task with --trace)
!
! Precompiling assets failed.
!
! Push rejected, failed to compile Ruby app.
! Push failed

是這段問題嗎?
Running: rake assets:precompile
rake aborted!
ArgumentError: '' is not a supported controller name.

不知道怎麼弄一弄,竟然好了.....

0
dream4781
iT邦新手 5 級 ‧ 2018-05-23 19:45:11

不好意思,想請問一下:
在一開始產生完後臺,執行rails s之後,變成這樣:
Error
如果不管這個問題照著後續執行,就會卡在登入的部分,輸入了帳號密碼之後不會跳轉到Index,但也不會出現錯誤,就是把頁面更新一次之後依然在登入的頁面
嗚嗚嗚不太懂這是發生了什麼事情QAQ

看更多先前的回應...收起先前的回應...

看不到你貼的圖呢

好像要點開新分頁去看?
⋯⋯怎麼就連圖片的上傳都不成功呢QAQ
https://imgur.com/a/QSbEdUV

你的 KeywordMapping 裡面沒有 channel_id 應該是你前面的章節有東西跳過了?

好的 我再試試看 謝謝大大抽空回答OVO

謝謝卡米大,已經解決channel_id的問題了
想再問問能不能在後台管理的地方做切開字元?
關鍵字很難每次都打一樣的(越做越多就忘了確切的關鍵字QQ)

我要留言

立即登入留言