gem 'device'でログイン機能を追加したはいいものの、
デフォルトだと誰でもユーザ登録が出来て何かと不便な事があります。
(クローズドβとか)
そんなときに役に立つのが、gem 'cancan'です。
今回のケースでは、既にdeviceが稼働しているシステムに権限を追加する方向で作業します。
まずは、Gemfileに
gem 'cancan'
を追加し、
$ bundle install $ rails g migration add_role_to_users role:string $ rake db:migrate:reset $ rake db:reset $ rails g cancan:ability
で導入準備完了です。
二行目のコマンドで、既存のUserモデルにroleが追加されました。
app/models/users.rbに対応するロジックを記述します。
class User < ActiveRecord::Base ##中略 attr_accessible :role ROLES=%w[admin user] ##後略 end
続いて、既存データベースの更新ですが……
すみません。今回のシステムではuserをseed.rbで作っているのでそちらの修正コードを添付します。
誰か詳しい方動いてるsqlに一括してデータ登録する方法を教えて下さい(
...まぁ、気を取り直して
#{Rails.root}/db/seeds.rbを
table_names = ["users","measure"] table_names.each do |table_name| path = "#{Rails.root}/db/seeds/#{Rails.env}/#{table_name}.rb" require(path) if File.exist?(path) end
のように設定している場合、
#{Rails.root}/db/seeds/development/users.rbを以下のように編集します。
##ユーザ情報配列 name = %w[alpha beta] device_id = %w[001 002] passeord = %w[alpha001 beta002] ##まずは通常ユーザの生成 number.times do |i| user = User.create( :name => name.shift, :device_id => device_id.shift, :password => password[i], :password_confirmation => password[i], :role => "user" ) ##続いて、管理ユーザの生成。 ##実際のパスワード等々は別ファイルで記述する事を強く勧めます。 User.create( :name => "admin", :device_id => "000", :password => "pass000", :password_confirmation => "pass000", :role => "admin" )
続いて、app/models/ability.rbに以下を追加
class Ability include CanCan::Ability ##中略 def initialize(user) user ||= User.new # guest user (not logged in) if user.role == "admin" can :manage, :all else can :read, :all end end ##後略 end
あとは、ログイン後、view/home/main.html.erbのようなファイルに
<% if can? :manage, @user %> <p><%= link_to 'ユーザー登録', [ :new, :user_registration ] %></p> <% end %>
といった記述を追加してあげれば、特定ユーザのみがデータ登録をできる仕組みが作れます。