日別アーカイブ: 2021年11月24日

Rails-tutorialのまとめ(第10章 ユーザーの更新 主に演習)

その9から続く

10.1.1 編集フォーム

ユーザーのeditアクションapp/controllers/users_controller.rb
class UsersController < ApplicationController
 #追加
  def edit
   @user = User.find(params[:id])  end    
  end

beforeフィルター (before filter) を使ってこのアクセス制御を実現できます。

1: ユーザーのeditビュー
app/views/users/edit.html.erb

<% provide(:title, "Edit user") %>
<h1>Update your profile</h1>

<div class="row">
<div class="col-md-6 col-md-offset-3">
  <%= form_for(@user) do |f| %>
    <%= render 'shared/error_messages' %>
    <%= 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, "Confirmation" %>
    <%= f.password_field :password_confirmation, class: 'form-control' %>
    <%= f.submit "Save changes", class: "btn btn-primary" %>
<% end %>
<div class="gravatar_edit">
  <%= gravatar_for @user %>
   <a href="http://gravatar.com/emails" target="_blank">change</a>
   </div>
  </div>
</div>

gravatarへのリンクでtarget=”_blank”が使われていますが、
これを使うとリンク先を新しいタブ(またはウィンドウ)で開くようになるので、
別のWebサイトへリンクするときなどに便利です。

Railsはどうやって新規のPostと既存のPatchを区別している?
Railsは、form_for(@user)を使ってフォームを構成すると、@user.new_record?がtrueのときにはPOSTを、falseのときにはPATCHを使います。

レイアウトの “Settings” リンクを更新するapp/views/layouts/_header.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="container">
    <%= link_to "sample app", root_path, id: "logo" %>
    <nav>
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "Home", root_path %></li>
        <li><%= link_to "Help", help_path %></li>
        <% if logged_in? %>
          <li><%= link_to "Users", '#' %></li>
          <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
              Account <b class="caret"></b>
            </a>
            <ul class="dropdown-menu">
              <li><%= link_to "Profile", current_user %></li>
               <li>
                <%= link_to "Settings", edit_user_path(current_user) %></li>
              <li class="divider"></li>
              <li>
                <%= link_to "Log out", logout_path, method: :delete %>
              </li>
            </ul>
          </li>
        <% else %>
          <li><%= link_to "Log in", login_path %></li>
        <% end %>
      </ul>
    </nav>
  </div>
</header>

演習

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

rel= “noopener”を追加するだけ

続きを読む