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

到这里用户管理也做好了。


基础编就到这里了。辛苦你了!
接下的应用编里作作看简单的网络聊天的网站。用在这里学的內容,作作看吧!