2012年6月12日火曜日

RailsアプリをPostgreSQLで開発してHerokuにデプロイするまでの簡単まとめ

PostgreSQLの設定や開発用ユーザーの作成、Heroku Toolbeltのインストールは完了しているものとします。

1. アプリケーション作成

$ rails new blog -d postgresql
$ cd blog

2. データベース設定

config/database.ymlの開発用DBとテスト用DBを設定

development:
  adapter: postgresql
  encoding: unicode
  database: blog_development
  pool: 5
  username: ユーザー名
  password: パスワード

.gitignoreにconfig/database.ymlを追加

# Ignore database.yml
/config/database.yml

3. データベース作成

$ rake db:create

4. データベースのマイグレーション

$ rails g scaffold post name:string title:string content:text
$ rake db:migrate

5. ルーティング設定

$ rm public/index.html

config/routes.rbを編集

  root :to => 'posts#index'

6. Herokuにデプロイ

アセットの事前コンパイル

$ rake assets:precompile

以下、デプロイ

$ git init
$ git add .
$ git commit -m 'init'
$ heroku login
$ heroku create --stack cedar
$ git push heroku master
$ heroku run rake db:migrate

動作確認

$ heroku open

動作しなければログを確認

$ heroku logs

2012年5月30日水曜日

Railsのサンプルで「Can't mass-assign protected attributes」ってエラーが出た

Ruby on Rails Guides: Getting Started with Rails」にあるBlogアプリのサンプルでRailsの基本を勉強していたところ、最後のところで動作しなかったのでメモ。

11 Building a Multi-Model Form」にあるように、tagというモデルを追加して、views/posts/_form.html.erbにタグの編集を追加すると、フォームのsubmitでエラーが発生するようになりました。

エラーの内容は以下。

ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: tags_attributes):

トレースを見ていると、assign_attributesでエラーが発生しているので、文字通り、保護された属性tags_attributesにアクセスしようとしたのが原因っぽい。

ということで、app/models/post.rbを次のように直したらあっさり解決。

class Post < ActiveRecord::Base
#  attr_accessible :content, :name, :title
  attr_accessible :content, :name, :title, :tags_attributes
...
end

Rails 3.1ベースで書かれたドキュメントで、そもそもmodelのソースにattr_accessibleがないので、ここを変更するという指示がなかったのでしょう。

こちらの環境は3.2.3なんで、極力バージョンが近いものを参考にするようにした方がよさそうだと学習。

2012年3月8日木曜日

ソーシャルボタンを設置したら動作確認を!w

ほんと恥ずかしい話です…

衆議院議員 安倍晋三 公式サイト

コドモのためのワークショップ・イベント企画|ピコトン

いいね!ボタンを押してみると…

はてなブックマークボタンも…

+1ボタンも…

どうなってるか想像はできるけど、一応ソースも見ておきましょうか。

衆議院議員 安倍晋三 公式サイト

<div id="rightSideMenu_socialLink">
<ul>
<li class="facebook"><!-- facebook -->
<div class="fb-like" data-href="http://workshop.picoton.com" data-send="false" data-layout="button_count" data-width="20" data-show-faces="true"></div>
<!--facebook end--></li>
<li class="hatena"><!--hatena-->
<a href="http://b.hatena.ne.jp/entry/http://workshop.picoton.com" class="hatena-bookmark-button" data-hatena-bookmark-title="コドモのためのワークショップ・イベント" data-hatena-bookmark-layout="simple" title="このエントリーをはてなブックマークに追加"><img src="http://b.st-hatena.com/images/entry-button/button-only.gif" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="http://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
<!--hatena end--></li>
<li class="twitter"><!--twitter-->
<!--Twitter Follow Button-->
<iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://platform.twitter.com/widgets/follow_button.html?screen_name=AbeShinzo&amp;lang=ja&amp;show_count=false" style="height:20px; width: 90px;"></iframe>
<!--twitte endr--></li>
<li class="google"><!--google+1-->
<!-- このタグを +1 ボタンを表示する場所に挿入してください -->
<g:plusone size="medium" href="http://workshop.picoton.com"></g:plusone>

<!-- この render 呼び出しを適切な位置に挿入してください -->
<script type="text/javascript">
  window.___gcfg = {lang: 'ja'};

  (function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
  })();
</script>
<!--google+1 end--></li>
</ul>
</div>

コピペしたままやんw
うわぁ…

一回でも動作確認すれば気づくでしょうに…

しかもこれ、個人が趣味でやってるサイトじゃなくて、元総理の公式サイトですからね(泣)
日本ヤバいw

最低限の動作確認くらいしようよってのは、ソーシャルボタンに限った話じゃないですけどね!

@AbeShinzo宛にツイートしといたんだけど、どうなるでしょうか。
早急に対応されることを期待します。