11 : 用戶管理③

上章:用戶管理②

Header11 這個章是,上章「用戶管理②」繼續的內容。
還沒看完上章的內容的話、請參考這裡吧。

4 : 作會員的投稿

「用戶管理」的內容,到這裡我們做了 這個三個內容。

接着用設定的會員的資料,在投稿上顯示會員的資料吧!

例如說...

到這裡的內容,我們用「posts」資料庫裡的「name」的框子,顯示作投稿的人的資料。
可是在會員制的網站的話,一次一次打入自己的名字有一點麻煩。
所以在這裡想做做看,不用自己打自己的名字就可以作投稿的設定。

為了設定這個,作投稿的時候在投稿的資料庫裡保存作投稿的會員的資料(作這個投稿的會員的id是1 等等)。然後用這個資料顯示會員的資料。
在這邊作的網頁是,
如果是有登入的會員的話,顯示的網頁上作新增・編輯資料的網頁(沒有打入名字的框子)。 Chrome posts new after devise Chrome posts 1 edit after devise 在投稿資料編輯完成・顯示投稿的網頁上、顯示投稿或者作投稿的會員的資料Chrome posts create after devise Chrome posts all after devise create post Chrome posts 1 after devise create post Chrome posts 1 update after devise Chrome posts 1 destroy after devise 為了要顯示這樣的內容,在「posts」資料庫上追加作投稿的會員的框子。用這個會員資料的框子,顯示會員資料。

之後用這個投稿資料裡的會員的資料,
不讓會員編輯或者刪除自己以外的會員作的資料(如果自己的投稿被別人編輯的話有一點危險呢)的設定。
所以在這個章,設定下面三個設定。
  • 「posts」資料庫裡追加,會員的框子
  • 操作資料・顯示網頁的設定
  • 檢查會員可不可以編輯・刪除資料的設定
那麽,開始做吧!

 ① : 更改「posts」資料庫

到這裡的「posts」資料庫裡有「name」的框子,所以作投稿的網頁(0.0.0.0:3000/posts/new)上裡有「name」的輸入框。

但是在這裡為了在作投稿的網頁上自動保存會員的資料,不使用這個「name」的框子而使用會員資料(id)的框子顯示名字,所以不用「name」的輸入框。
 「name」的輸入框跟作好的投稿資料就都不用了,所以取掉好了!

 在投稿的「show」網頁上, 點擊刪除投稿 刪除全部的資料吧。

 資料刪除之後,接着刪除框子吧。

框子的刪除要先作編輯資料庫的設定文件之後,再來刪除資料庫。
※ 框子的刪除,請參考這裡

 首先用terminal,移動到「myapp」吧。


 使用Windows移動的方法,請參考這裡


 terminal(用半母字母數字打入)
1 2 3 cd Desktop cd rails_project cd myapp

 為了作設定資料庫的文件,在terminal上打入下面的命令吧

terminal(用半母字母數字打入)
 使用Windows的話,用「命令提示符」吧。
1 rails g migration removeColumnFromPost

要作更改資料庫的框子的設定文件的時候,
rails g migration 設定文件的名字
在terminal上打入上面的內容。
名字使用什麼都可以,但是我們推薦使用簡單一點自己可以理解的名字。

db > migrate > 日子_remove_column_from_post.rb是作好的設定文件,參考下面編輯內容吧!

 日子_remove_column_from_post.rb(用半母字母數字打入)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


1 2 3 4 5 class RemoveColumnFromPost < ActiveRecord::Migration def change remove_column :posts, :name, :string end end

這個
remove_column :資料庫的名字, :框子的名字, :資料的種類
在做框子的刪除。
※ 詳細請參考這裡

設定好了之後為了適用設定的內容,打入

terminal
 使用Windows的話,用「命令提示符」吧。
1 rake db:migrate

的內容吧。
 如果不動的話,前面加「bundle exec」,打入「bundle exec rake db:migrate」吧。

做好這裡的話,用Sequel Pro看看資料庫的內容吧!
※ 打開Sequel Pro的方法,請參考這裡
 使用Windows的話,使用SqliteBrowser吧。


「name」的框子有沒有刪除了呢?
 那麽「posts」資料庫裡追加會員資料的框子的設定吧。

「posts」資料庫裡追加放會員資料的「users」資料庫的「id」的框子「user_id」

框子的設定使用跟「users」資料庫的「id」一樣的設定,框子的資料的種類是「數字」・名字是「user_id」

例如說,如果「id是189」的會員投稿的話,posts」資料庫的「user_id」裡放「189」的資料,用這個會員號碼的資料顯示名字
那麽做做看吧!

首先從設定文件開始作!
※ 詳細請參考這裡

terminal(用半母字母數字打入)
 使用Windows的話,用「命令提示符」吧。
1 rails g migration addColumnToPost2

※ 應為不能用同樣的名字,所以後面加「2」。但是等一會兒看的時候知道裡面在設定什麼的話,使用什麼名字也可以。

作完了之後,參考下面的內容設定db > 日子_add_column_to_post2.rb的內容吧。

 日子_add_column_to_post2.rb(用半母字母數字打入)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


1 2 3 4 5 class AddColumnToPost2 < ActiveRecord::Migration def change add_column :posts, :user_id, :integer end end

這個
add_column :資料庫的名字, :名字, :資料的種類
追加框子的內容。放數字的資料的種類是integer
※ 詳細請參考這裡吧。
設定文件作好了之後,為了適用設定的內容,打入

terminal
 使用Windows的話,用「命令提示符」吧。
1 rake db:migrate

這樣子框子的編輯完成了。
 不動的話,前面追加「bundle exec」,打入「bundle exec rake db:migrate」吧。

Sequel Pro看看內容吧。
※ Sequel Pro的話請參考這裡,SqliteBrowser的話請參考這裡吧。

有沒有追加「user_id」了嗎? Sequel pro add user id
用這個「user_id」,在網頁上顯示投稿的會員的資料。


 ⑵ : 資料操作跟網頁顯示的設定


到這裡更改了框子的內容了,所以隨着更改的內容必須編輯資料操作跟顯示網頁的設定
「name」的框子在操作資料・顯示網頁這個兩個使用,所以在這裡設定用user_id的內容。

 ⑴ : 操作資料


首先編輯posts_controller.rb的內容,設定不使用「name」而使用「user_id」的資料吧。

要編輯的時候,還要追加兩個設定。
  • 作資料的時候(create),在「user_id」裡放會員資料的設定
  • 在網頁上顯示的標記「@user」的設定
在這裡,做做看各個內容吧!

  • 作資料的時候,在「user_id」裡面放會員資料

  •  首先複習內容吧。在「def create」的部分,設定可以編輯「content」「place」「user_id」的框子的內容吧。
    ※ 不知道的話,請參考這裡


     posts_controller.rb(第17〜19行)
    ※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
     使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


    17 18 19 def create @post = Post.create(params.require(:post).permit(:content, :place, :user_id)) end

    新增・編輯資料的時候,
    .require(:資料庫的名字(單數).permit(:資料庫的框子...))
    
    的地方在限制資料庫。
    ※ 詳細的內容請參考這裡
    這樣設定好了保存「user_id」的資料的內容,但是在「user_id」裡面放資料的設定還沒設定好。
    接着在「user_id」裡放會員的資料吧。

    可是,這個「user_id」不能用輸入框。
    如果作投稿的網頁上有打入會員資料的輸入框的話,網站就變成可以用別人的會員資料投稿吧。這有一點危險・・・

    「user_id」的內容,使用取得登入的會員資料的「current_user」在「posts_controller.rb」裡面設定。

    編輯posts_controller.rb的內容吧。

     posts_controller.rb(第17〜19行)
    ※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
     使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


    17 18 19 def create @post = Post.create(params.require(:post).permit(:content, :place, :user_id).merge(:user_id => current_user.id)) end

    第18行的... , :user_id)後面追加了

    18 .merge(:user_id => current_user.id)

    的內容了。
    這樣子設定好了「user_id」裡,放「current_user」的「id」的內容了。
    看看內容可不可以理解,
    :user_id => current_user.id
    
    「user_id」裡放「current_user」的「id」嗎?
    這個設定跟使用「rails c」新增(create)編輯(update)的時候的內容一樣。
    「user_id」裡放「current_user」的「id」的內容。

    那麽,
    .merge()
    
    在做什麼呢?

    這個是資料操作上追加設定的時候的設定。像這一次保存,在網頁上沒有打入的資料的時候會使用。
  • 「@user」的設定

  • 接着設定在網頁上顯示資料的標記@user吧。
    作「users」網頁的時候一樣,網頁上顯示的標記@user設定在posts_controller.rb裡面

    在這裡要顯示投稿的會員資料,所以在posts_controller.rb上的
    • 顯示投稿的資料「show
    • 顯示作好的資料「create
    • 顯示編輯好的資料「update
    • 顯示刪除好的資料「destroy

    設定標記@user
    @user裡面要設定作投稿的會員資料,這個是用
    User.find(id號碼)
    
    設定。

    在這個後面追加的「id號碼」裡,放「posts」資料庫的「user_id」。

     例如說,id」是「890」的會員資料

    1 @user = User.find(890)

    這樣打入選擇會員資料。

    但是在這裡後面的「id」的部分放「posts」資料庫的「user_id」選擇投稿的會員資料。
    那麽在show的網頁上設定看吧。

     posts_controller.rb(第5〜8行)
    ※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
     使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


    5 6 7 8 def show @post = Post.find(params[:id]) @user = User.find(@post.user_id) end

    這樣@user」裡選擇了作「@post」的投稿的會員資料。

    作「@post」的投稿的會員,用「find」選擇「id是@post.user_id」的會員。
    在網頁上顯示,這個@user」的「family_name」跟「first_name
     設定網頁之前,在剩下的「create」「update」「destroy」上也設定同樣的設定吧!

     posts_controller.rb(第18〜39行)
    ※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
     使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


    18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 def create @post = Post.create(params.require(:post).permit(:content, :place, :user_id).merge(:user_id => current_user.id)) @user = User.find(@post.user_id) end def edit @post = Post.find(params[:id]) end def update @post = Post.find(params[:id]) @post.update(params.require(:post).permit(:content, :place)) @user = User.find(@post.user_id) end def destroy @post = Post.find(params[:id]) @post.destroy @user = User.find(@post.user_id) end end

到這裡「user_id」跟顯示網頁的「@user」的設定完成了。

接着刪除「name」,顯示設定的「@user」吧!


 ⑵ : 顯示網頁


 那麽,設定網頁的顯示吧。
顯示「posts」資料庫的「name」的地方,改成用「users」資料庫的「family_name」跟「first_name」顯示吧。

這個顯示的編輯有
  • 編輯輸入框
  • 顯示「@user」的資料「family_name」「first_name
的兩個。
首先做輸入框的編輯吧。

  • 輸入框的編輯

  • 在這裡設定使用「user_id」做posts_controller.rb」裡的資料操作
    首先刪除網頁顯示裡設定的「name」的輸入款,再來用「user_id」作輸入框吧

    在設定「name」的輸入框在new.html.erb網頁裡。

     那麽編輯「new.html.erb」的內容吧!

     new.html.erb
    ※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
     使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


    4 5 6 <p>名字</p> <%= f.text_field :name, :class => "form-control my-form" %> <br>

    刪除第4~6行吧。

    ※ 一起點擊「Command」跟「c」停止,用rails s打開的服務器之後,再打入「rails s」吧。


     使用Windows的話、
     一起點擊「ctrl」跟「c」停止,用「rails s」打開的服務器之後,再打入「rails s」吧。


    這樣,輸入框也刪除了,
    接着編輯在顯示「@post」的「name」的網頁,改成使用「@user」的「family_name」「first_name」顯示吧
  • @user的顯示

  • 那麽,顯示看會員資料吧。

     在網頁上顯示「@user」的「family_name」要怎麼設定好呢?


    1 <%= @user.family_name %>

    使用@user」的這個設定,在
    • show.html.erb
    • create.html.erb
    • update.html.erb
    • destroy.html.erb

    的網頁裡顯示會員的資料「family_name」「first_name吧。
    首先在show的網頁裡,顯示@userfamily_name」跟「first_name吧!
    打開app > views > posts > show.html.erb之後,參考下面的內容編輯吧。

     show.html.erb(編輯第2〜4行目)
    ※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
     使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


    1 2 3 4 5 6 7 8 <hr> <p><%= @user.family_name %><%= @user.first_name %></p> <h4><%= @post.content %></h4> <small><%= @post.created_at %>:<%= @post.place %></small> <hr> <p><a href="/posts" class="btn btn-info">返回主頁</a></p> <p><a href="/posts/<%= @post.id %>/edit" class="btn btn-success">編輯投稿</a></p> <p><a href="/posts/<%= @post.id %>" data-method="delete" class="btn btn-danger">刪除投稿</a></p>

    這樣設定好了,在投稿的網頁上顯示會員資料的內容了。

    還有為了網頁顯示的更漂亮編輯了第3,4行的html。不要忘記編輯內容吧。
    同樣的
    • create.html.erb
    • update.html.erb
    • destroy.html.erb
    也參考下面,編輯內容吧!


     create.html.erb(編輯第2〜5行)
    ※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
     使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


    1 2 3 4 5 6 7 <h1>投稿作好了</h1> <hr> <p>名字:<%= @user.family_name %><%= @user.first_name %></p> <p>内容:<%= @post.content %></p> <p>地方:<%= @post.place %></p> <hr> <a href="/posts" class="btn btn-info">返回主頁</a>

     update.html.erb(編輯第3〜5行)
    ※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
     使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


    1 2 3 4 5 6 7 <h1>投稿編輯好了</h1> <hr> <p>名字:<%= @user.family_name %><%= @user.first_name %></p> <p>内容:<%= @post.content %></p> <p>地方:<%= @post.place %></p> <hr> <a href="/posts" class="btn btn-info">返回主頁</a>

     destroy.html.erb(編輯第3〜5行)
    ※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
     使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


    1 2 3 4 5 6 7 <h1>刪除投稿了</h1> <hr> <p>名字:<%= @user.family_name %><%= @user.first_name %></p> <p>内容:<%= @post.content %></p> <p>地方:<%= @post.place %></p> <hr> <a href="/posts" class="btn btn-info">返回主頁</a>

     這樣設定好了「create」「update」「destroy」的顯示網頁的設定了!
    這樣「index.html.erb」以外的「posts」網頁的設定好了。在這裡設定看「index.html.erb」的內容吧。

    在「index.html.erb」裡用「@posts」的資料顯示一個一個的「user」資料。但是到這裡沒有說明使用「@posts」顯示「user」資料的方法。
    ※ 詳細請參考這裡

    其實指定會員資料的
    User.find(id號碼)
    
    可以在html文件上
    <%= %>
    
    也使用。在這裡是用這個,設定內容。

     例如說要設定「id」是「90」的會員的「family_name」的話,

    1 <%= User.find(90).family_name %>

    可以這樣設定,顯示「id」是「90」的會員的「family_name」。

    那麽在「id號碼」的部分放「user_id」,設定看會員資料的顯示吧。
    打開app > views > posts > index.html.erb之後,參考下面編輯內容。

     index.html.erb(編輯第4、5行)
    ※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
     使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


    1 2 3 4 5 6 7 8 <h1>投稿一覽</h1> <hr> <% @posts.each do |p| %> <p><a href="/users/<%= p.user_id %>"><%= User.find(p.user_id).family_name %><%= User.find(p.user_id).first_name %></a>的投稿</p> <h3><a href="/posts/<%= p.id %>"><%= p.content %></a></h3> <hr> <% end %> <a href="/posts/new" class="btn btn-primary">新增投稿</a>

    編輯的地方是

    4 <p><a href="/users/<%= p.user_id %>">...



    4 <%= User.find(p.user_id).family_name %><%= User.find(p.user_id).first_name %>

    這個兩個地方。
    這一次的在index網頁上,把選擇全部的資料的
    Post.all
    
    <% @post.each do |p| %>
    
    分成一個一個的資料「p」(詳細請參考這裡)。

    從這個「p」取得的「user_id」,做會員的選擇跟「family_name」「first_name」的顯示

    4 <%= User.find(p.user_id).family_name %><%= User.find(p.user_id).first_name %>


    ※ 一起點擊「Command」跟「c」停止,用rails s打開的服務器之後,再打入「rails s」吧。


     使用Windows的話、
     一起點擊「ctrl」跟「c」停止,用「rails s」打開的服務器之後,再打入「rails s」吧。


    做好之後打開「0.0.0.0:3000/posts/new」吧!
     使用Windows的話,打開「localhost:3000/posts/new」吧。

    有沒有顯示下面一樣的網頁嗎? Chrome posts new after devise before 出來之後,打入內容 Chrome posts new after devise 點擊登錄吧!
    有沒有顯示下面一樣的網頁嗎? Chrome posts create after devise 這樣子投稿的內容保存好了。
    使用Sequel Pro或者,打開「show」網頁看看資料有沒有保存了沒!
     使用Windows的話,打開SqliteBrowser看看內容吧!
    打開看「index」網頁「0.0.0.0:3000/posts」或是「edit」網頁「0.0.0.0:3000/posts/1/edit」看看內容吧。 Chrome posts all after devise create post Chrome posts 1 after devise create post Chrome posts 1 edit after devise Chrome posts 1 update after devise Chrome posts 1 destroy after devise


最後做內容的總結。


 ⑶ : 總結


在這裡
刪除在「new」網頁設定的「name」輸入框、設定用登入的會員資料投稿資料。

為了這個,設定了
  • 操作資料
  • 顯示會員的資料
這個兩個。在這裡說明這個兩個內容。

設定的內容請參考這裡

  • 操作資料

  • 資料操作有
    • 新增資料(create)時候,在「user_id」裡追加資料
    • 設定要顯示的「@user」
    的這個兩個。
     要新增資料要設定「posts_controller.rb」「create」裡追加「user_id」的內容。

     posts_controller.rb
    17 18 19 def create @post = Post.create(params.require(:post).permit(:content, :place, :user_id).merge(:user_id => current_user.id)) end

     在顯示的資料操作裡,設定「@user」的標記。

     posts_controller.rb
    5 6 7 8 def show @post = Post.find(params[:id]) @user = User.find(@post.user_id) end

  • 顯示會員資料

  • 會員資料從資料操作的@user顯示資料。

     show.html.erb
    1 2 3 4 5 6 7 8 <hr> <p><%= @user.family_name %><%= @user.first_name %></p> <h4><%= @post.content %></h4> <small><%= @post.created_at %>:<%= @post.place %></small> <hr> <p><a href="/posts" class="btn btn-info">返回主頁</a></p> <p><a href="/posts/<%= @post.id %>/edit" class="btn btn-success">編輯投稿</a></p> <p><a href="/posts/<%= @post.id %>" data-method="delete" class="btn btn-danger">刪除投稿</a></p>

    雖然內容很長,可是不用@user也可以設定顯示。

     index.html.erb
    1 2 3 4 5 6 7 8 <h1>投稿一覽</h1> <hr> <% @posts.each do |p| %> <p><a href="/users/<%= p.user.id %>"><%= User.find(p.user_id).family_name %><%= User.find(p.user_id).first_name %></a>的投稿</p> <h3><a href="/posts/<%= p.id %>"><%= p.content %></a></h3> <hr> <% end %> <a href="/posts/new" class="btn btn-primary">作投稿</a>

    設定的內容請參考這裡
    這樣用會員的資料作好投稿了嗎?

    到這裡網站也大概作好了。但是在現在的網站有登入的會員誰都可以編輯刪除別人作的投稿。這個有一點不好。

    接下來為了修這個,設定「會員的檢查」吧。


 ⑶ : 檢查會員的資料


最後在投稿的編輯・刪除的網頁裡追加檢查會員資料的設定把。這個是「用戶管理」最後的內容。
現在的網頁,誰都可以編輯・刪除別人作的投稿。這個有一點不好,所以修這個設定吧!
解釋在這裡設定的內容把。在別人的投稿網頁上不顯示「編輯投稿」「刪除資料」的按鈕, Chrome posts 1 invalid user 想移動到別人作的「edit」「update」「destroy」網頁的時候, Chrome posts all invalid user 移動到主頁,顯示通知的設定吧。

會員的檢查要在操作資料的設定文件posts_controller.rb裡面設定,之前使用的
ifelse
if 條件
  内容
else
  内容
end
的內容。
如果跟條件成立的時候執行if裡面的內容,不成立的時候執行else的設定。
那麽做做看吧!

 ⑴ : 網頁上判別條件


要判別會員要怎麼設定內容好呢?

這個是,用「@post」的「user_idcurrent_user」的「id」是不是一樣的條件判別。

判別一不一樣的條件,使用
要判別的東西 == 要判別的東西
設定。設定裡有兩個等號,請注意。

所以例如說,用「if」判別「@user」的「id」是不是「1」的條件的時候要,

1 2 3 4 5 if @user.id == 1 #内容 else #内容 end

這樣子設定。
不成立的時候,執行或者顯示else裡面的內容。
用這個條件的方法,設定判別「posts」資料庫裡的「user_id」跟「current_user」的「id」一不一樣的條件

 那麽,用「if」設定看「@posts」的「user_id」跟「current_user」的「id」一不一樣的條件吧


1 2 3 4 5 if @post.user_id == current_user.id #内容 else #内容 end

 用這個條件判別,是不是「正確的會員」。
那麽首先,在「posts」資料庫的「show」網頁裡設定,如果打開的是投稿是打開的會員作的投稿的時候而已顯示

編輯投稿

刪除投稿


的內容吧! Chrome posts 1 after devise create post Chrome posts 1 invalid user 在設定show網頁的app > views > posts > show.html.erb文件裡,設定下面的內容。

 show.html.erb(追加第7~10行)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


1 2 3 4 5 6 7 8 9 10 <hr> <p><%= @user.family_name %><%= @user.first_name %></p> <h4><%= @post.content %></h4> <small><%= @post.created_at %>:<%= @post.place %></small> <hr> <p><a href="/posts" class="btn btn-info">返回主頁</a></p> <% if @post.user_id == current_user.id %> <p><a href="/posts/<%= @post.id %>/edit" class="btn btn-success">編輯投稿</a></p> <p><a href="/posts/<%= @post.id %>" data-method="delete" class="btn btn-danger">刪除投稿</a></p> <% end %>

註冊新的會員之後,用這個新的會員看已經作好的投稿吧。

※ 一起點擊「Command」跟「c」停止,用rails s打開的服務器之後,再打入「rails s」吧。


 使用Windows的話、
 一起點擊「ctrl」跟「c」停止,用「rails s」打開的服務器之後,再打入「rails s」吧。


沒有顯示按鈕的話OK。 Chrome posts 1 invalid user
那麼點擊登出的按鈕之後,再打開投稿的網頁吧。
有沒有顯示下面一樣的畫面嗎? Chrome posts 1 error after sign out 這個是應為在沒有會員的時候,像從current_user」裡面拿出「id」的時候會出來的錯誤。
為了修改這個錯誤,設定會員有沒有登入的判別(user_signed_in?,在會員登入的時候而已顯示按鈕。
 那麼,設定「show網頁app > views > posts > show.html.erb的文件裡設定內容吧。

 show.html.erb(用半母字母數字打入)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


1 2 3 4 5 6 7 8 9 10 11 12 <hr> <p><%= @user.family_name %><%= @user.first_name %></p> <h4><%= @post.content %></h4> <small><%= @post.created_at %>:<%= @post.place %></small> <hr> <p><a href="/posts" class="btn btn-info">返回主頁</a></p> <% if user_signed_in? %> <% if @post.user_id == current_user.id %> <p><a href="/posts/<%= @post.id %>/edit" class="btn btn-success">編輯投稿</a></p> <p><a href="/posts/<%= @post.id %>" data-method="delete" class="btn btn-danger">刪除投稿</a></p> <% end %> <% end %>

這樣做好了,在「user_signed_in」的條件判別OK的時候,顯示按鈕的設定。

那麽看看按鈕會不會顯示。打開看自己喜歡的投稿的網頁吧。

※ 一起點擊「Command」跟「c」停止,用rails s打開的服務器之後,再打入rails s吧。


 使用Windows的話,
一起點擊「ctrl」跟「c」停止,用「rails s」打開的服務器之後,再打入「rails s」吧。


有沒有顯示按鈕了呢? Chrome posts 1 after devise create post

 「users」資料庫的「show」網頁「0.0.0.0:3000/users/1」的

編輯會員資料

裡也追加是不是正確的會員的條件吧。
※ 在「users_controller.rb」的「show」設定的「@user」的「id」跟「current_user」的「id」是不是一樣的條件判別。
※ 在「users_controller.rb」里已經判別有没有會員,所以不用設定users_signed_in」的判別



 show.html.erb(在第8,10行上面,放鼠標可以看答案)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


1 2 3 4 5 6 7 8 9 10 <h1>會員資料</h1> <hr> <p>名字:<%= @user.family_name %><%= @user.first_name %></p> <p>自我介紹:<%= @user.self_introduction %></p> <hr> <p><a href="/posts" class="btn btn-info">返回主頁</a></p> <p><a href="/users" class="btn btn-primary">返回會員一覽</a></p> <% if @user.id == current_user.id %> <p><a href="/users/<%= @user.id %>/edit" class="btn btn-success">編輯會員資料</a> <% end %>

 到這裡使用「是不是正確的會員」的條件,設定顯示按鈕的內容了!
但是在現在的網站上,如果是會員的話誰都可以移動到「posts」資料庫的「edit」網頁「0.0.0.0:3000/posts/1/edit」或者「users」資料庫的「edit」網頁「0.0.0.0:3000/users/1/edit」等等的網頁。

在這裡設定,如果不是正確的會員的話, Chrome posts all invalid user 像上面的圖像一樣,移動到posts」資料庫的「index」網頁「0.0.0.0:3000/posts吧。

顯示通知吧!


這個也在controller文件裡設定
if @post.user_id == current_user.id
  #内容
else
  #内容
end
的內容。


 ⑵ : 資料操作的條件判別


需要判別正確的會員的網頁是,編輯・刪除保存的投稿的
  • edit
  • update
  • destroy
這個三個網頁。

首先用,
if @post.user_id == current_user.id
  #内容
else
  #内容
end
的條件,如果不是正確的會員的話不讓他做「posts」資料庫的「update」的操作資料的設定。
編輯app > controllers > posts_controller.rb文件的內容吧!

 posts_controller.rb(編輯第31〜34行)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


28 29 30 31 32 33 34 35 def update @post = Post.find(params[:id]) @user = User.find(@post.user_id) if @post.user_id == current_user.id @post.update(params.require(:post).permit(:content, :place)) else end end

在這裡也做同樣的條件判別。

31 if @post.user_id == current_user.id

上面的條件成立的時候而已

32 @post.update(params.require(:post).permit(:content, :place))

更新資料。
※ 已經設定好@user了,所以條件就用下面的內容就OK
if @user.id == current_user.id
if @user == current_user

  「destroy」的資料刪除也用這個條件判別,只讓正確的會員而已刪除資料吧
(在第40〜43行上面放鼠標,就可以看到答案)



 posts_controller.rb(第37〜44行)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


37 38 39 40 41 42 43 44 def destroy @post = Post.find(params[:id]) @user = User.find(@post.user_id) if @post.user_id == current_user.id @post.destroy else end end

到這裡設定了「正確的會員」而已可以操作資料的設定了。
這樣資料不會讓別的會員操作很安心,但是現在的網站不是「正確的會員」的會員也可以移動到「posts」資料庫的「edit」「update」「destroy」網頁。

接着在「else」裡面放內容,條件不成立的時候,移動到「posts」資料庫的「index」網頁吧。
使用html的網頁移動要
<a href="移動到的url">顯示的文字</a>
這樣設定。

但是這個網頁的移動,不只是在html文件裡使用。在「controller」裡面移動網頁的時候使用別的設定。

controller文件上的網頁移動用
redirect_to "移動到的網頁"
這樣的設定。

使用這個設定會員不是「正確的會員」的時候,移動到0.0.0.0:3000/posts的網頁吧。
首先設定「update」吧。

 posts_controller.rb(追加第34、35行)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


28 29 30 31 32 33 34 35 36 37 def update @post = Post.find(params[:id]) @user = User.find(@post.user_id) if @post.user_id == current_user.id @post.update(params.require(:post).permit(:content, :place)) else redirect_to "/posts" flash[:alert] = "無效的會員" end end

移動以外還有設定了,顯示通知

35 flash[:alert] = "無效的會員"

的設定。下面的

34 redirect_to "/posts"

在設定移動到「/posts」0.0.0.0:3000/posts的內容。
使用跟這個一樣的方法,設定「destroy」吧。

 posts_controller.rb(追加第45、46行)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


39 40 41 42 43 44 45 46 47 48 def destroy @post = Post.find(params[:id]) @user = User.find(@post.user_id) if @post.user_id == current_user.id @post.destroy else redirect_to "/posts" flash[:alert] = "無效的會員" end end

這樣設定好了。

 在「posts_controller.rb」的「edit」裡追加,不是「正確的會員」的會員的話,移動到「0.0.0.0:3000/posts」顯示「無效的會員」的通知的設定吧。
※ 如果是正確的會員的話,不用設定內容


 posts_controller.rb(第26〜30行)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


23 24 25 26 27 28 29 30 31 def edit @post = Post.find(params[:id]) @user = User.find(@post.user_id) if @post.user_id == current_user.id else redirect_to "/posts" flash[:alert] = "無效的會員" end end

到這裡設定了,不是正確的會員的話,不能移動到「posts」資料庫的「edit」「update」「destroy」網頁的內容了。

 最後在「users_controller.rb」的「edit」「update」裡設定同樣的設定吧!
(在上面放鼠標,可以看答案)



 users_controller.rb(第13〜17行目/第22〜27行目)
※ 用半母字母數字打入。一起點擊「Command」跟「s」可以保存內容。
 使用Windows的話,點擊「ctrl」跟「s」可以保存內容。


13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 def edit @user = User.find(params[:id]) if @user.id == current_user.id else redirect_to "/posts" flash[:alert] = "無效的會員" end end def update @user = User.find(params[:id]) if @user.id == current_user.id @user.update(params.require(:user).permit(:first_name, :family_name, :self_introduction)) else redirect_to "/posts" flash[:alert] = "無效的會員" end end

這樣在「users」網頁上,設定了「正確的會員」的檢查了。
這一次的內容請參考這裡

 最後做總結。


 ⑶ : 總結


到這裡
不能讓全部的會員打開的「users」「posts」
  • edit
  • update
  • destroy
網頁上追加了「正確的會員」的檢查。


為了這個,使用
  • 條件判別(if/else)
  • 網頁移動(redirect_to)
設定內容。
在這裡解釋,各個設定。

設定的內容,請參考這裡
  • 條件判別(if/else)

  • 判別條件有沒有成立,做編輯網頁的顯示・資料的操作的設定。
    請參考ifelse

    這一次設定了判別條件一不一樣的內容。
    判別一不一樣用
    要判別的東西 == 要判別的東西
    
    設定。
    設定,請參考下面的內容吧。

     show.html.erb
    1 2 3 4 5 6 7 8 9 10 <hr> <p><%= @user.family_name %><%= @user.first_name %></p> <h4><%= @post.content %></h4> <small><%= @post.created_at %>:<%= @post.place %></small> <hr> <p><a href="/posts" class="btn btn-info">返回主頁</a></p> <% if @post.user_id == current_user.id %> <p><a href="/posts/<%= @post.id %>/edit" class="btn btn-success">編輯投稿</a></p> <p><a href="/posts/<%= @post.id %>" data-method="delete" class="btn btn-danger">刪除投稿</a></p> <% end %>

  • 移動網頁(redirect_to)

  • 「controller」文件上的網頁移動要
    redirect_to "移動到的網頁"
    
    設定。
    使用這個的設定的方法,請參考下面(裡面還設定了顯示通知flash)。

     posts_controller.rb
    28 29 30 31 32 33 34 35 36 37 def update @post = Post.find(params[:id]) @user = User.find(@post.user_id) if @post.user_id == current_user.id @post.update(params.require(:post).permit(:content, :place)) else redirect_to "/posts" flash[:alert] = "無效的會員" end end

到這裡用戶管理也完了。


基礎編就到這裡了。辛苦你了!
接下的應用編裡作作看簡單的網絡聊天的網站。用在這裡學的內容,作作看吧!