Fendo181 / RoRTutorial_chap04

0 stars 0 forks source link

演習10 #35

Closed Fendo181 closed 7 years ago

Fendo181 commented 7 years ago

演習10.0

(1)

先ほど触れたように、target="_blank"で新しいページを開くときには、セキュリティ上の小さな問題があります。それは、リンク先のサイトがHTMLドキュメントのwindowオブジェクトを扱えてしまう、という点です。具体的には、フィッシング (Phising) サイトのような、悪意のあるコンテンツを導入させられてしまう可能性があります。Gravatarのような著名なサイトではこのような事態は起こらないと思いますが、念のため、このセキュリティ上のリスクも排除しておきましょう。対処方法は、リンク用のaタグのrel (relationship) 属性に、"noopener"と設定するだけです。早速、リスト 10.2で使ったGravatarの編集ページへのリンクにこの設定をしてみましょう。

<div class="gravatar_edit">
  <%= gravatar_for @user %>
  <a href="http://gravatar.com/emails" rel="noopener" target="_blank">change</a>
</div>

(2)

リスト 10.5のパーシャルを使って、new.html.erbビュー (リスト 10.6) とedit.html.erbビュー (リスト 10.7) をリファクタリングしてみましょう (コードの重複を取り除いてみましょう)。ヒント: 3.4.3で使ったprovideメソッドを使うと、重複を取り除けます3。(関連するリスト 7.27の演習課題を既に解いている場合、この演習課題をうまく解けない可能性があります。うまく解けない場合は、既存のコードのどこに差異があるのか考えながらこの課題に取り組んでみましょう。例えば筆者であれば、リスト 10.5のテクニックをリスト 10.6に適用してみたり、リスト 10.7のテクニックをリスト 10.5に適用してみたりするでしょう。)

<%= form_for(@user,url: signup_path) do |f| %>

ここに着目して、修正してみる。

<%= form_for(@user, url: yield(:url)) do |f| %>   
  <%= render 'shared/error_messages', object: @user %>

  <%= f.label :name %>
  <%= f.text_field :name, class: 'form-control' %>

  <%= f.label :email %>
  <%= f.email_field :email, class: 'form-control' %>

  <%= f.label :password %>
  <%= f.password_field :password, class: 'form-control' %>

  <%= f.label :password_confirmation %>
  <%= f.password_field :password_confirmation, class: 'form-control' %>

  <%= f.submit yield(:button_text), class: "btn btn-primary" %>
<% end %>
<% provide(:title, 'Sign up') %>
# 
<% provide(:url, signup_path) %>  
<% provide(:button_text, 'Create my account') %>
<h1>Sign up</h1>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
      <%= render 'form' %>
  </div>
</div>
<% provide(:title, "Edit user") %>
<% provide(:url, user_path) %> 
<% provide(:button_text, 'Save changes') %>
<h1>Update your profile</h1>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
      <%= render 'form' %>
    <div class="gravatar_edit">
      <%= gravatar_for @user %>
      <a href="http://gravatar.com/emails" target="_blank" rel="noopener">change</a>
    </div>
  </div>
</div>
Fendo181 commented 7 years ago

演習10.1

(1)

実際に編集が成功するかどうか、有効な情報を送信して確かめてみましょう。

編集前 Kobito.0Dm8oP.png

編集後 Kobito.KOR03T.png

(2) もしGravatarと紐付いていない適当なメールアドレス (foobar@example.comなど) に変更した場合、プロフィール画像はどのように表示されるでしょうか? 実際に編集フォームからメールアドレスを変更して、確認してみてましょう。

省略

Fendo181 commented 7 years ago

演習 10.33

(1) フレンドリーフォワーディングで、最初に渡されたURLにのみ確実に転送されていることを確認するテストを作成してみましょう。続けて、ログインを行った後、転送先のURLはデフォルト (プロフィール画面) に戻る必要もありますので、これもテストで確認してみてください。ヒント: リスト 10.29のsession[:forwarding_url]が正しい値かどうかを確認するテストを追加してみましょう。

#値を入力してeditが成功した事を確認するテスト
  test 'successful edit with friendly forwarding' do
  get edit_user_path(@user)
  assert session[:forwarding_url]
  log_in_as(@user)
  assert_redirected_to edit_user_url(@user) || default
  name = "Foo Bar"
  email = "foo@bar.com"
  patch user_path(@user), params: { user: { name: name,
                                        email: email,
                                        password: "",
                                        password_confirmation: "" } }
  assert_not flash.empty?
  assert_redirected_to @user
  #データベースから最新のユーザー情報を読み込み直して、正しく更新されたかどうかを確認する。
  @user.reload
  assert_equal name, @user.name
  assert_equal email, @user.email
end

(2) 7.1.3で紹介したdebuggerメソッドをSessionsコントローラのnewアクションに置いてみましょう。その後、ログアウトして /users/1/edit にアクセスしてみてください (デバッガーが途中で処理を止めるはずです)。ここでコンソールに移り、session[:forwarding_url]の値が正しいかどうか確認してみましょう。また、newアクションにアクセスしたときのrequest.get?の値も確認してみましょう (デバッガーを使っていると、ときどき予期せぬ箇所でターミナルが止まったり、おかしい挙動を見せたりします。熟練の開発者になった気になって (コラム 1.1)、落ち着いて対処してみましょう)。

(byebug) session[:forwarding_url]
"http://localhost:3000/users/3/edit"
(byebug)"http://localhost:3000/login"
(byebug) request.get?
true
Fendo181 commented 7 years ago

演習 10.4.2

管理者ユーザーとしてログインし、試しにサンプルユーザを2〜3人削除してみましょう。ユーザーを削除すると、Railsサーバーのログにはどのような情報が表示されるでしょうか?

Started DELETE "/users/3" for 127.0.0.1 at 2017-07-11 17:16:51 +0900

Processing by UsersController#destroy as HTML
  Parameters: {"authenticity_token"=>"DSkat+S9qTGDg5GHAEjAqKSt3bdX+MyD4YiGlWoP/7k0snbwlomQz3Msp5zaJmlWRK0pAX5WbFC3iXDio8rPCg==", "id"=>"3"}
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 3], ["LIMIT", 1]]
   (0.1ms)  begin transaction
  SQL (0.6ms)  DELETE FROM "users" WHERE "users"."id" = ?  [["id", 3]]
   (2.5ms)  commit transaction
Redirected to http://localhost:3000/users
Completed 302 Found in 9ms (ActiveRecord: 3.5ms)