Hatena::ブログ(Diary)

130単位

2013-12-31

Sitespecを使ってみた感想

Background

  • 住んでるシェアハウスWebサイトがなかった
  • プロモーションの拠点として必要性を感じた
  • 最初は割とよく耳にするMiddlemanで作ろうかと思った
  • 直近で読んだr7kamuraさんの記事 Sitespec - r7km/s に影響を受けた
    • "Middlemanの嫌いなところは、何をするにもMiddlemanに従う必要があることだった"
  • 必要十分そうなSitespecというツールがそこにあったので使ってみることにした

Goal

  • とりあえず1ページでよい
  • 費用や入居までの流れなどがわかればよい
  • デザインはシンプルかつそれなりな見栄えであればよい
  • コンテンツはMarkdownで書きたい
  • Herokuくらい簡単に公開したい

Sitespec with Sinatra

r7kamuraさんのブログ(ソース)はPadrino使ってますが、全部引用するのは忍びないのでSinatra使ってみました。

helpers do
  def markdown markdown_text
    renderer = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks: true)
    renderer.render(markdown_text)
  end
end
use Rack::Static, :urls => ['/images'] #Sitespecに渡すアプリにこう書く

Others

Result

ぼちぼちコンテンツ増やしていきたいと思っています(あと入居者募集中です!)。

Conclusion

上記の画像の件ですが、Sitespecとしては "まずは画像のパスをSpecに書け" というテストファースト的コンセプトなんだと思います。RSpec派生ツールなので当然といえば当然なんですが、そこを理解するとスムーズに開発できる気がします。ほぼ学習コスト無しでいけるため、さくっと静的サイトを作りたい場合にはMiddlemanよりおすすめです、たぶん!

Links


4774158798
パーフェクトRuby (PERFECT SERIES 6)

*1:IFTTTなどでTwitterに流しているとなおさら

2013-11-24

Rails3.2 -> Rails4.0 アップグレード

2ヶ月遅れくらいで記事書いてます。実行時はRails4.0.0でしたが、4.0系であれば同様の手順でいけると思います。エラーで修正必須か非推奨警告のみかは曖昧だったりします。

Gemfile

#gem 'rails', '~> 3.2'
gem 'rails', '~> 4.0'
gem 'activerecord-session_store'

Rails

rake rails:update
  • bin 以下にrailsなどの実行ファイル
  • config以下は上書きされるので diff して必要な設定を書き戻し
  • config/initializers/filter_parameter_logging.rb 追加
  • config/initializers/secret_token.rb
    • secret_token -> secret_key_base
rake rails:update 以外のファイル
  • update
  • add
    • README.rdoc
    • app/controllers/concerns
    • app/models/concerns
  • remove
ApplicationController
  • protect_from_forgery
    • generateされるものは with: :exception になっており、通常はこのオプションがよい
    • :with オプションを指定しない場合は :null_session
Routing
  • :via 指定なしの match をなくす
  • put -> patch
    • 変更した場合はViewでlink_toの:method指定も :patch にする
正規表現
  • 意図しないマッチを避けるため ^ よりも \A、$ よりも \z か \Z を使う
ProtectedAttributes
  • Model から attr_accessible 削除
  • save/create の without_protection 削除
StrongParameters
  • 利用したほうがよいが、一時的に無効化する場合の設定
    • config.action_controller.permit_all_parameters = true
Scope / Conditioned associations
  • whereなどの条件をlambdaの中で指定
ActiveRecord::Base.all
  • Model.scoped -> Model.all
    • all が AR::Relation を返すようになった
Where condition
  • whereで関連先の条件を文字列で指定する場合は references(:table_name) が必要
Associationの細かい仕様変更
@blog.posts.size #=> 0
@blog.posts.build
@blog.posts.pop
@blog.posts.size #=> 0(Rails3) 1(Rails4)
Data attributes in view
= submit_tag 'submit', confirm: 'OK?', disable_with: 'processing...'
= submit_tag 'submit', data: { confirm: 'OK?', disable_with: 'processing...' }
Exception name

Gems

  • MetaSearch -> Ransack
    • MetaSearchはRails4で動かない
    • 依存度により移行はそれなりに大変で、そのうち別記事で書くかも
  • Spork -> Spring
    • 流行り/設定簡略化
  • DatabaseCleaner -> DatabaseRewinder
    • 流行り/速度改善 (※Ruby2.0のみ)

More information


4774155071
WEB+DB PRESS Vol.73

2013-10-15

Rails3.0 -> Rails3.2 アップグレード

今さら需要があるかわからない3.2へのアップグレード情報です。半年前にはほぼ準備完了していたんですが、諸事情あった末にようやく調整ができたので、先日アップグレードしました。ちなみにRails4リリース後のセキュリティメンテナンス対象は3.2系のみであるため、3.1系以前を運用されている方はできるだけアップグレードしたほうがいいと思います。

Gitのlogを見ながら書き起こしているため、エラーか非推奨警告かは曖昧な上に、もしかしたらバージョンアップ関係ない点もあるかもしれませんがご了承ください。

Gemfile

#gem 'rails', '~> 3.0'
gem 'rails', '~> 3.2'
#gem 'mysql2', '< 0.3'
gem 'mysql2'
gem 'devise-encryptable'
#gem 'jpmobile', '< 2.0'
gem 'jpmobile'
#gem 'spork', '> 0.9.0.rc'
#gem 'guard', '~> 0.8.8'
  • 古いバージョン指定を除外(コメントアウト分が3.0用)
  • DeviseでRestful Authentication互換のEncryptorを利用しているのでDevise Encyptable追加

Rails

rake rails:update
  • config以下が3.2のデフォルトで上書きされる
  • git diff で3.0の内容と比較しながら設定
config.assets.enabled = false
  • asset pipeline をオフにして3.0時代のasset管理を継続
has_many_association#clear
# has_many :posts
has_many :posts, :dependent => :delete_all
  • 3.0は @user.posts.clear = @user.posts.delete_all だった
  • 3.2は :dependent を指定しないと 関連idを NULL で UPDATE する
    • 関連idがNULL不可の場合、:dependent を :delete_all (または :destroy) にする
Rails.cache with specific instances
config.eager_load_paths += %W[#{config.root}/lib]
config.after_initialize do
  require_dependency 'my_class' unless defined? MyClass
end
MimeType
  • config/initializers/mime_types.rb でPDF追加してたけど不要になった

Gems

Devise
<%#= confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>
<%= confirmation_url(@resource, :confirmation_token => @token) %>
#User.__send__(:generate_token, 'encrypted_password').slice(0, 8)
Devise.friendly_token.slice(0, 8)
RSpec(Guard)
#guard 'rspec', :version => 2, :cli => '--fail-fast --drb' do
guard 'rspec', :cli => '--fail-fast --drb' do
  • :version 指定不要
Capybara
  • git mv spec/requests spec/features
  • Capybara2系の仕様により、Capybara::DSL を使うspecをfeaturesへ移動
#select @datetime.month.to_s, :from => 'created_at_2i'
select "#{@datetime.month}", :from => 'created_at_2i'
#select @datetime.hour.to_s, :from => 'created_at_4i'
select '%02d' % @datetime.hour, :from => 'created_at_4i'
  • optionのテキスト検出が厳格になった
#click_button 'resource_submit'
click_button '登録する'
  • FormBuilder で submit の id が付かなくなった
Fabrication
  • resource!{ ... } -> resource{ ... }
  • sequence はブロック化して遅延評価
  • :from => Resource -> :class_name => :resource

感想

そもそもアップグレードが遅れたのは、非エンジニアがpublic以下を編集することが多いアプリで、asset pipeline対応ができなかったのが原因でした。ただ対応しないという判断で割り切ってしまえば、2系から3系よりは、対象項目が少なかった印象です。またテストを書いていたため、(テスト自体の修正もあったものの)比較的安心して進めることができました。Model.pluckが使えるようになったのが地味にうれしいですね。


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

関連記事

2013-09-09

JS勉強会しました #mtsmhack

準備不足でコンテンツ未定なままだったのは反省点ですが、パーフェクトJavaScriptの一部を読んだりしました。

パーフェクトJavaScript

477414813X

全部読んだわけではないのですが印象などを。

  • ボリュームすごい
  • プログラミング初心者向けではない
  • 業務で必要な人はクライアントサイドJSを説明したPart3から読むといいかも
  • 前半のPartは基礎の理解と掘り下げに
  • 後半のPartは必要な際にリファレンスとして使うのがいいかも
  • jQueryの情報は1.6.2対象で若干古い
    • 例えば1.7からの .on()メソッドに対応してない

JavaScriptの学びかた

せっかくなので参加者のみなさんにJavaScriptをどうやって学んだか聞いてみました。

あらためて思うのは、JSを業務で使うにはHTMLCSSも理解しないといけませんし、これ読んでおけばいいという1冊を求めるのではなく、何冊か交互に読んだりして実践の中で身に付けるのがいいんじゃないかと思います。自分はJavaScript/jQueryに慣れたと感じるまでは約1年かかった気がします。

その他


4774153761
ノンプログラマのためのJavaScriptはじめの一歩 (WEB+DB PRESS plus)

477415489X
JavaScript徹底攻略 (WEB+DB PRESS plus)

関連記事

2013-09-03

Rails ポリモーフィック関連の関連名の命名

Railsポリモーフィック関連という機能があります。

class Picture < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true
end

class Employee < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

class Product < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

ざっくりいうと、複数の親Modelに属するような子Modelの関連を抽象化してまとめる機能です。詳しくはRails Guidesや以下のリンク先を参照ください。

関連名

ここで注目したいのが、Modelを関連づける関連名です。Rails Guidesの例にある "imageable"。聞き慣れないですが、どうなんでしょう。確かにimageは動詞でもあるため文法的には間違ってなさそうです。が、実際に扱おうとすると違和感が生じてきます。

親Modelから子Modelを参照する際は通常の関連と同様に扱えます。

pictures = employee.pictures

逆に子Modelから呼び出そうとすると、以下のようになります。

employee = picture.imageable

imageable というメソッドで employee が返るのはちょっとわかりにくい気がします。

命名具体例

調べていて、関連名の付けかたには2種類あるように見受けられました。(見出しは造語です)

able接尾辞
子Model関連名親Model
Comment :commentable Article/Photo
Address :addressable Person/Company
AttachmentImage :attachable Blog/Entry
抽象名詞
子Model関連名親Model
Item :parent User/Machine
Comment :resource Diary/Book/Shop
Paste :item Snippet/Picture
Employee :work_place Office/Factory

抽象名詞のほうで"parent"や"resource"は抽象度が高く、(開発者間で納得できれば)汎用的に使えそうです。英語の意味的には"object"も使いたいところですが、object_idが予約されているため使えません。

命名比較

able接尾辞
  • able接尾辞なModuleをincludeする感じ
  • 関連名が動詞+ableなので悩まなくて済む
  • 子Modelから親Modelの呼び出しがわかりにくい
  • Rails Guideで例示されているということは推奨なのかもしれない
  • 海外のBlog記事ではable接尾辞の採用が目立つ
抽象名詞
  • 抽象名詞なClass継承する感じ(STIのような命名)
  • 適切な関連名が見つかるかどうかは対象Modelと語彙力に依存
    • ここで割と具体的な名詞を使うと他のModelに使える名詞がひとつ減る(細かいけど)
  • 子Modelから親Modelの呼び出しがまだわかりやすい
  • 日本人エンジニアは抽象名詞を採用している例が見受けられる

まとめ

特に結論はありません。初めて使ってみた印象などを書いてみました。どちらを選択するかは好みの問題だと思います。ちなみに、自分のケースでは抽象名詞を採用しました。やはり子Modelからの参照時に名詞であったほうが違和感が少ないように思えたからです。たとえ返るObjectがメソッド名と異なったとしても、ですね。(ただし命名には苦労しました…)

ご意見などあれば遠慮なくいただけるとありがたいです!


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

4797363827
Rails3レシピブック 190の技