19
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

図書管理システム karitakke 製作その3

Last updated at Posted at 2015-04-02

図書管理システムkaritakkeの製作記です。単なる備忘録です。
過去の投稿は以下から!

Amazon APIをつかってISBNから本の情報を取得

こんな感じでISBNコードを入力して検索ボタンを押すと、
01.png
書籍情報を取得できるようにします。
02.png

下準備

Amazonで

  • アクセスキー
  • シークレットキー
  • アソシエイトタグ
    を取得します。そしてconfig/application.rbに以下を追記します。中身は取得したものに適宜変更してください。
config/application.rb
Amazon::Ecs.options = {
    :associate_tag =>     'アソシエイトタグ',
    :AWS_access_key_id => 'アクセスキー',
    :AWS_secret_key =>   'シークレットキー'
}

ルーティングの変更

config/routes.rbに以下を追加します。

config/routes.rb
  get 'get_info', to: 'books#get_info', path: "/books/new/get_info"

/books/new/get_infoというURLはBooksコントローラーのget_infoというメソッドで処理するようにします。

コントローラー

上でルーティングの設定をしたので、Booksコントローラーにget_infoメソッドを追加していきます。

app/controllers/books_controller.rb
  def get_info
    Amazon::Ecs.debug = true
    res = Amazon::Ecs.item_search(params[:isbn],
         :search_index   => 'Books',
         :response_group => 'Medium',
         :country        => 'jp'
       )
    info = {'Title' => res.first_item.get('ItemAttributes/Title'),
            'Author' => res.first_item.get('ItemAttributes/Author'),
            'Manufacturer' => res.first_item.get('ItemAttributes/Manufacturer'),
            'Publication_Date' => res.first_item.get('ItemAttributes/PublicationDate')
            }
    render json: info
  end

Amazon APIからISBNコードで書籍情報を取得し、タイトル・著者名・出版社・出版日をJSON形式で吐き出します。

CoffeeScript

こちらのページを参考に、

  • ISBNコードを数値のみ入力させる
  • Amazon APIにISBNコードを投げて帰ってきた書籍情報をフォームに入力するAjax処理

を作ります。

app/assets/javascripts/books.coffee
$(document).on 'ready page:load', -> # turbolinks対策
  ### ISBNコード入力フォーム:数値のみの入力 ###
  $('#book_isbn').keydown ->
    presskey = String.fromCharCode(event.keyCode);
    event.returnValue = /[0-9\b\t\n]/.test(presskey) # 入力受付キーを正規表現で指定

  ### 書籍情報取得ボタン:Ajaxで情報取得 ###
  $('#info_search_button').click ->
    isbncode = $('#book_isbn').val()
    $.ajax
      async:    true
      url:      "/books/new/get_info/"
      type:     "GET"
      data:     {isbn: isbncode}
      dataType: "json"
      context:  this
      error: (jqXHR, textStatus, errorThrown) -> # 通信/サーバエラーなど
        $("#msg").css("color","#ff0000").html(errorThrown)
      success:  (data, textStatus, jqXHR) ->
        if data?
          $("#book_title").val(data.Title) # タイトル
          $("#book_author").val(data.Author) # 著者
          $("#book_manufacturer").val(data.Manufacturer) # 出版社
          $("#book_publication_date").val(data.Publication_Date) # 出版日
        else
          $("#msg").css("color","#ff0000").html("書籍情報が見つかりませんでした。")

  ### MSGのリセット ###
  $("#book_isbn").change -> $("#msg").html("")

cancancanを使ってみる!

製作その1でcancancanの設定をしてあるので、実際に使ってみましょう。
まず、app/models/ability.rbを以下のように編集します。管理者には全ての権限を与え、一般ユーザーはUserモデルの更新、Bookの閲覧、Rentalに関する全ての操作を許可し、ログを閲覧、削除できないようにします。

app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.admin?
      can :manage, :all
    else
      can :update, User
      can :read, Book
      can :manage, Rental
      cannot :read, Log
      cannot :destroy, Log
    end
  end
end

次に該当するコントローラに以下を追加します。

load_and_authorize_resource

例えば、

app/controllers/books_controller.rb
class BooksController < ApplicationController

  load_and_authorize_resource
  before_action :set_book, only: [:show, :edit, :update, :destroy]

  def index
  	...

のようになります。
さらに、app/controllers/apprication_controller.rbを以下のようにします。

app/controllers/apprication_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  before_action :authenticate_user!

  before_action :configure_permitted_parameters, if: :devise_controller?

  # 以下を追加
  rescue_from CanCan::AccessDenied do |exception|
    redirect_to root_url, :alert => exception.message
  end

  protected
  
  def configure_permitted_parameters
   # 省略 ...
  end
end

設定はこんな感じでオッケーです。
あとはViewを編集します。たとえば、

<div class="btn-group">
    <%= link_to 'Show', book_path(b.id), class: "btn btn-info" %>
    <% if can? :update, Book %>
    <%= link_to 'Edit', edit_book_path(b.id), class: "btn btn-success" %>
    <% end %>
    <% if can? :destroy, Book %>
    <%= link_to 'Destroy', book_path(b.id), method: :delete, data: { confirm: "削除してもよろしいですか?" }, :class => "btn btn-danger" %>
	<% end %>
</div>

こんな感じにすると、権限を持っているユーザーにはEditボタン、Deleteボタンが表示されます。Showは全てのユーザーに表示されます。

完成?

これでとりあえずおわり。

参考

19
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?