Ruby1.9.1とgem1.9.1の設定

環境

  • Debian(Squeeze)
  • パッケージ管理(aptitude)
  • バージョン管理(update-alternatives)
  • ruby1.9.1
  • gem1.9.1

参考(本件とは異なりますが、一応知識として・・・)

http://arika.org/2010/08/30/ruby-1-9-2-and-rubygems-1-3-7-and-gem-path

目的

以前、requireエラーが出ていたので色々調べた結果、
バージョン管理のミスでした。

$ruby -e 'p Gem.path'
[".gem/ruby/1.9.1", "/var/lib/gems/1.9.1"]
ここで、Gem.pathが「/var/lib/gems/1.9.1」を参照している。

ところが、「/var/lib/gems/1.9.1」先がなかった・・・。
rubyのバージョンは、1.9.1にしたけど
gemは1.8のバージョンのまま使っていた。

$gem list
$gem1.9.1 list
で比較すると、標準がgem1.8になっているのに気づく。

バカだ〜と思い鬱になりながらも
気を取り直して、
aptitudeとupdate-alternativesコマンドを使って設定!
rails関連、/usr/bin/*1.8*関係も調べて、
「update-alternatives」で管理するようにした。

Carrierwave

目的

ファイルのアップロード

参考

carrierwave

インストール

gem 'carrierwave'

r g scaffold paint name:string
r g uploader image
r g migration add_image_to_paints image:string

app/models/paint.rb

attr_accessible :name, :image
mount_uploader :image, ImageUploader

app/views/paints/_form.html.erb

<%= form_for @paint, :html => {:multipart => true} do |f| %>
(省略)


<%= f.file_field :image %>

(省略)

アップロードした画像を表示する
app/views/paints/show.html.erb

image:
<%= image_tag(@paint.image_url) if @paint.image? %>

実行

実行すると、画像ファイルがアップされます。
保存先

public/uploads/gallery/image/1/画像ファイル名

Rubyでシリアル通信

参考

橋本商会

インストール

gem install serialport

シリアル通信を行う

require 'rubygems'
gem 'serialport','>=1.0.4'
require 'serialport'

# 9600bps, 8bit, stopbit 1, parity none
sp = SerialPort.new('/dev/tty.usb-serialdevice', 9600, 8, 1, 0)
line = sp.gets
a << 'a'
a << 'b'
sp.puts a

が動かない。
「gem list」にはserialportがあるのに、
ロードできない?

Rails3.0 で Devise と CanCan を動かす

目的

 認証と権限

環境

  • gem 1.3.7
  • Rails 3.0.5
  • Devise 1.1.8
  • CanCan 1.6.2

内容

Welcome(認証)->TOP(権限にて表示を変更)

Welcomeページの作成、deviseの設定は省略します。
lounge1975さんの日記を参考にいたしました。

Gemfile
gem 'devise'
gem 'cancan'
$ bundle install

Userモデルとビューの作成
$ r g devise:install
$ r g devise users
$ r g devise:views
$ r g migration add_role_to_users role:string
$ rake db:migrate
$ r g cancan:ability

app/models/users.rbに以下を追加
(省略)
attr_accessible :role
ROLES=%w[admin author]
(省略)

app/models/ability.rbに以下を追加
(省略)
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.role == "admin"
can :manage, :all
else
can :read, :all
end
end
(省略)

app/views/devise/registrations/new.html.rbと
app/views/devise/registrations/edit.html.rbに以下を追加
に以下を追加
(省略)
<%= f.label :role %>
<%= f.collection_select :role, User::ROLES, :to_s, :humanize%>
(省略)

app/views/hoges/index.html.erbを編集(ここではadminだけにEditを表示させます)<% if can? :manage, hoge %><%= link_to 'Edit', edit_hoge_path(hoge) %><% end %>

実行すると、'Admin'でのユーザ登録者のみが
「Edit」できるようになります。
その他のユーザは「Edit」できません。

あと書き

Deviseで認証、cancanは権限です。cancanは権限を継承したり、代理も可能そうなので、おもしろそうだと感じました。