<?xml version="1.0" encoding="utf-8" ?>


<?xml-stylesheet href="http://d.hatena.ne.jp/holysugar/rssxsl" type="text/xsl" media="screen"?>


<rdf:RDF
xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xml:lang="ja">
<channel rdf:about="http://d.hatena.ne.jp/holysugar/rss">
<title>HWPS別館</title>
<link>http://d.hatena.ne.jp/holysugar/</link>
<description>HWPS別館</description>

<dc:creator>holysugar</dc:creator>
<dc:date>2012-05-22T17:58:58+09:00</dc:date>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://d.hatena.ne.jp/holysugar/20120410/p1"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/holysugar/20120215/p1"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/holysugar/20120105/p1"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/holysugar/20120105/p2"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/holysugar/20111115/p1"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/holysugar/20111107/p1"/>
</rdf:Seq>
</items>
</channel>



<item rdf:about="http://d.hatena.ne.jp/holysugar/20120410/p1">
<title>[Rails]responders と RSpec</title>
<link>http://d.hatena.ne.jp/holysugar/20120410/p1</link>
<description> responders で書き換えられた scaffold で RSpec が通らなくなる件。 Post の内容がエラーかどうかを判定するのに、 scaffold では AR::Base#save の戻り値で判定しているため、Spec は次のようになっている。（ここでは ItemsController の Spec と仮定する） it &#34;re-r</description>

<content:encoded><![CDATA[
<div class="section">
<p>responders で書き換えられた scaffold で RSpec が通らなくなる件。</p>
<p>Post の内容がエラーかどうかを判定するのに、 scaffold では AR::Base#save の戻り値で判定しているため、Spec は次のようになっている。（ここでは ItemsController の Spec と仮定する）</p>
<pre class="syntax-highlight">
      it <span class="synSpecial">&#34;</span><span class="synConstant">re-renders the 'new' template</span><span class="synSpecial">&#34;</span> <span class="synStatement">do</span>
         <span class="synComment"># Trigger the behavior that occurs when invalid params are submitted</span>
        <span class="synIdentifier">Item</span>.any_instance.stub(<span class="synIdentifier">:save</span>).and_return(<span class="synConstant">false</span>)
        post <span class="synIdentifier">:create</span>, {<span class="synIdentifier">:item</span> =&#62; {}}, valid_session
         response.should render_template(<span class="synSpecial">&#34;</span><span class="synConstant">new</span><span class="synSpecial">&#34;</span>)
       <span class="synStatement">end</span>
</pre>

<p>一方で responders で生成されるコントローラの判定は respond_with(@resource) で行われるため、AR::Base#errors の内容で判定される。</p>
<p>そのため save を stub してしまうと、 errors が生成されないためエラーと判断されない。</p>
<p>save を stub しないようにして、 invalid なパラメータを与え save に失敗し errors を生成するか、あるいは errors を stub してやればよい。</p>
<pre class="syntax-highlight">
        <span class="synIdentifier">Item</span>.any_instance.stub(<span class="synIdentifier">:save</span>).and_return(<span class="synConstant">false</span>)
        <span class="synIdentifier">Item</span>.any_instance.stub(<span class="synIdentifier">:errors</span>).and_return({<span class="synIdentifier">:name</span> =&#62; <span class="synSpecial">'</span><span class="synConstant">invalid</span><span class="synSpecial">'</span>})
        post <span class="synIdentifier">:create</span>, {<span class="synIdentifier">:item</span> =&#62; {}}, valid_session
</pre>

<p><ins datetime="2012-05-22T17:58:57+09:00">2012-05-22追記: ライブラリ名をずっと間違えて書いていたのでしれっと直した。</ins></p>
</div>
]]></content:encoded>
<dc:creator>holysugar</dc:creator>
<dc:date>2012-04-10</dc:date>
<dc:subject>Rails</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/holysugar/20120215/p1">
<title>[Ruby][Rails] 久々に Ruby toolbox を眺めてみたメモ</title>
<link>http://d.hatena.ne.jp/holysugar/20120215/p1</link>
<description> ほんとにメモだけ。 チェックしておくと便利そう https://www.ruby-toolbox.com/categories/Active_Record_Enumerations https://www.ruby-toolbox.com/categories/Active_Record_Value_Cleanup https://www.ruby-toolbox.com/categories/API_Builders https://github.com/n</description>

<content:encoded><![CDATA[
<div class="section">
<p>ほんとにメモだけ。</p>
<p>チェックしておくと便利そう</p>

<ul>
<li> <a href="https://www.ruby-toolbox.com/categories/Active_Record_Enumerations" target="_blank">https://www.ruby-toolbox.com/categories/Active_Record_Enumerations</a></li>
<li> <a href="https://www.ruby-toolbox.com/categories/Active_Record_Value_Cleanup" target="_blank">https://www.ruby-toolbox.com/categories/Active_Record_Value_Cleanup</a></li>
<li> <a href="https://www.ruby-toolbox.com/categories/API_Builders" target="_blank">https://www.ruby-toolbox.com/categories/API_Builders</a>

<ul>
<li> <a href="https://github.com/nesquena/rabl" target="_blank">https://github.com/nesquena/rabl</a></li>
</ul>
</li>
<li> <a href="https://www.ruby-toolbox.com/categories/EMail_Fake_Servers" target="_blank">https://www.ruby-toolbox.com/categories/EMail_Fake_Servers</a></li>
</ul>
<p>検証しないといけない気がする</p>

<ul>
<li> <a href="https://www.ruby-toolbox.com/categories/Active_Record_Named_Scopes" target="_blank">https://www.ruby-toolbox.com/categories/Active_Record_Named_Scopes</a></li>
<li> <a href="https://www.ruby-toolbox.com/categories/distributed_testing" target="_blank">https://www.ruby-toolbox.com/categories/distributed_testing</a>

<ul>
<li> <a href="http://logicalfriday.com/2011/05/18/faster-rails-tests-with-hydra/" target="_blank">http://logicalfriday.com/2011/05/18/faster-rails-tests-with-hydra/</a></li>
</ul>
</li>
<li> <a href="https://www.ruby-toolbox.com/categories/rails_admin_interfaces" target="_blank">https://www.ruby-toolbox.com/categories/rails_admin_interfaces</a></li>
<li> <a href="https://www.ruby-toolbox.com/categories/rails_presenters" target="_blank">https://www.ruby-toolbox.com/categories/rails_presenters</a></li>
<li> <a href="https://www.ruby-toolbox.com/categories/rails_in_place_editing" target="_blank">https://www.ruby-toolbox.com/categories/rails_in_place_editing</a></li>
<li> <a href="https://www.ruby-toolbox.com/categories/rails_form_builders" target="_blank">https://www.ruby-toolbox.com/categories/rails_form_builders</a></li>
<li> <a href="https://www.ruby-toolbox.com/categories/Table_Builders" target="_blank">https://www.ruby-toolbox.com/categories/Table_Builders</a>

<ul>
<li> <a href="https://github.com/bogdan/datagrid" target="_blank">https://github.com/bogdan/datagrid</a></li>
</ul>
</li>
</ul>
</div>
]]></content:encoded>
<dc:creator>holysugar</dc:creator>
<dc:date>2012-02-15</dc:date>
<dc:subject>Ruby</dc:subject>
<dc:subject>Rails</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/holysugar/20120105/p1">
<title>明けましておめでとうございます</title>
<link>http://d.hatena.ne.jp/holysugar/20120105/p1</link>
<description> この日記は今年も Rails 中心に淡々と気づいたメモを残していきたいと思います。だいぶ不定期ですがよろしくお願いいたします。 </description>

<content:encoded><![CDATA[
<div class="section">
<p>この日記は今年も Rails 中心に淡々と気づいたメモを残していきたいと思います。だいぶ不定期ですがよろしくお願いいたします。</p>
</div>
]]></content:encoded>
<dc:creator>holysugar</dc:creator>
<dc:date>2012-01-05</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/holysugar/20120105/p2">
<title>[Rails][Rack] Rack::GoogleAnalytics </title>
<link>http://d.hatena.ne.jp/holysugar/20120105/p2</link>
<description> leehambley/rack-google-analytics この Rack Middleware は、 production 環境のすべての HTML を返す URL に Google Analytics を組み込みたいというニーズがあったときに便利。以下サンプル。 Gemfile: gem ’rack-google-analytics’, :require =&#62; ’rack/google-analy</description>

<content:encoded><![CDATA[
<div class="section">
<p><a href="https://github.com/leehambley/rack-google-analytics" target="_blank">leehambley/rack-google-analytics</a></p>
<p>この Rack Middleware は、 production 環境のすべての HTML を返す URL に Google Analytics を組み込みたいというニーズがあったときに便利。以下サンプル。</p>
<p>Gemfile:</p>
<pre class="syntax-highlight">
gem <span class="synSpecial">'</span><span class="synConstant">rack-google-analytics</span><span class="synSpecial">'</span>, <span class="synIdentifier">:require</span> =&#62; <span class="synSpecial">'</span><span class="synConstant">rack/google-analytics</span><span class="synSpecial">'</span>
</pre>

<p>config/environments/production.rb:</p>
<pre class="syntax-highlight">
config.middleware.use <span class="synIdentifier">Rack</span>::<span class="synIdentifier">GoogleAnalytics</span>, <span class="synIdentifier">:tracker</span> =&#62; <span class="synSpecial">'</span><span class="synConstant">UA-xxxxxx-x</span><span class="synSpecial">'</span>
</pre>

<p>すべての layout ファイルに入れて回ったりしないので楽だし DRY。config.middleware.use を config/environments/production.rb に書くのがポイント。development.rb や application.rb に書けば、当然その環境でも有効になる。</p>
<p>この middleware は Google Analytics をすべてのレイアウトで間違いなく挿入する一つの方法になるのではと。(他の手段としては、個人的には、 application.js で require されるように asset pipeline 経由で書いてしまうのもアリだと思う)</p>
<h4> ただし</h4>
<p>Rack Middleware のレイヤーで HTML を操作することの是非は検討すべきかなと思うし、許容できる場合のみに使用すべきかと思う。</p>
<h4> 備考</h4>
<p>類似品として <a href="https://github.com/grays/rack-google_analytics" target="_blank">grays/rack-google_analytics</a> というのもある。（async で打てないので実用はむずかしいか?）</p>
</div>
]]></content:encoded>
<dc:creator>holysugar</dc:creator>
<dc:date>2012-01-05</dc:date>
<dc:subject>Rails</dc:subject>
<dc:subject>Rack</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/holysugar/20111115/p1">
<title>[Rails][Rack] Rack::Access で IP アドレス制限</title>
<link>http://d.hatena.ne.jp/holysugar/20111115/p1</link>
<description> Rails アプリケーションで IP アドレス制限が必要になった際には、基本的に上位のリバースプロキシ（Apache とか Nginx とか）で行うことが多いと思いますが、一方で Rails 本体で制限をかけなければならないこともあります（Heroku だとか） でもそれを Rails の controlle</description>

<content:encoded><![CDATA[
<div class="section">
<p>Rails アプリケーションで IP アドレス制限が必要になった際には、基本的に上位のリバースプロキシ（Apache とか Nginx とか）で行うことが多いと思いますが、一方で Rails 本体で制限をかけなければならないこともあります（Heroku だとか）</p>
<p>でもそれを Rails の controller 層とかで実装するのはちょっと嫌ですよね。特にビジネスロジックではないことが多いですし。</p>
<p>というわけで、IP アドレス制限を Rack Middleware 層で実装した Rack::Access というモジュールを使ってみました。これは <a href="https://github.com/rack/rack-contrib" target="_blank">rack/rack-contrib ? GitHub</a> に含まれています。使い方は Gemfile に書いて bundle して config/application.rb に設定を書いて完了です。</p>
<p>Gemfile:</p>
<pre class="syntax-highlight">
gem <span class="synSpecial">'</span><span class="synConstant">rack-contrib</span><span class="synSpecial">'</span>, <span class="synIdentifier">:require</span> =&#62; <span class="synSpecial">'</span><span class="synConstant">rack/contrib</span><span class="synSpecial">'</span>
</pre>

<p>config/application.rb</p>
<pre class="syntax-highlight">
config.middleware.use <span class="synSpecial">&#34;</span><span class="synConstant">Rack::Access</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">'</span><span class="synConstant">/</span><span class="synSpecial">'</span> =&#62; [ <span class="synSpecial">'</span><span class="synConstant">127.0.0.1</span><span class="synSpecial">'</span>,  <span class="synSpecial">'</span><span class="synConstant">192.168.1.0/24</span><span class="synSpecial">'</span> ]
</pre>

<p>これで 127.0.0.1 あるいは 192.168.1.0/24 以外からのアクセスには Forbidden を返すようになります。</p>
<p>当然、実行環境によって異なる制限をかけることになると思います。それぞれ environments/ 以下に書いてもいいと思うのですが、面倒なので自分は YAML に書きました。</p>
<p>config/application.rb</p>
<pre class="syntax-highlight">
config.middleware.use <span class="synSpecial">&#34;</span><span class="synConstant">Rack::Access</span><span class="synSpecial">&#34;</span>, <span class="synIdentifier">YAML</span>.load(open(<span class="synIdentifier">Rails</span>.root + <span class="synSpecial">&#34;</span><span class="synConstant">config/access.yml</span><span class="synSpecial">&#34;</span>, &#38;<span class="synIdentifier">:read</span>))[<span class="synIdentifier">Rails</span>.env]
</pre>

<p>config/access.yml</p>
<pre class="syntax-highlight">
<span class="synIdentifier">localnet</span><span class="synSpecial">:</span> <span class="synType">&#38;localnet</span>
  /<span class="synSpecial">:</span>
    <span class="synStatement">-</span> <span class="synConstant">127.0</span>.<span class="synConstant">0.1</span>
    <span class="synStatement">-</span> <span class="synConstant">192.168</span>.<span class="synConstant">1.0</span>/<span class="synConstant">24</span>

<span class="synIdentifier">development</span><span class="synSpecial">:</span>
  &#60;&#60;<span class="synSpecial">:</span> <span class="synType">*localnet</span>

<span class="synIdentifier">test</span><span class="synSpecial">:</span>
  &#60;&#60;<span class="synSpecial">:</span> <span class="synType">*localnet</span>

production
  /<span class="synSpecial">:</span>
    <span class="synStatement">-</span> xxx.xxx.xxx.xxx<span class="synComment"> # 公開対象アドレス</span>
</pre>

<p>動的に制限を変更するという使い方をしたければもう少し複雑にしなければいけませんが（一応できるはず）、イントラ向けアプリなどではこの程度で十分ではないでしょうか。</p>
<p>もちろん Rack middleware なので、 Rails 以外のアプリケーションでも同様に使えるのがいいですね。</p>
</div>
]]></content:encoded>
<dc:creator>holysugar</dc:creator>
<dc:date>2011-11-15</dc:date>
<dc:subject>Rails</dc:subject>
<dc:subject>Rack</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/holysugar/20111107/p1">
<title>[Rails] shoulda-mathcers での validate_uniquness_of の注意点</title>
<link>http://d.hatena.ne.jp/holysugar/20111107/p1</link>
<description> class User &#60; ActiveRecord::Base validate :name, :unique =&#62; true end ActiveRecord の↑のようなモデルの spec として、shoulda-matchers の validate_uniquness_of を使うことがある。 このときこんな風に書くと、場合によって通ったり通らなかったりするので注</description>

<content:encoded><![CDATA[
<div class="section">

<pre class="syntax-highlight">
<span class="synPreProc">class </span><span class="synType">User</span> &#60; <span class="synIdentifier">ActiveRecord</span>::<span class="synIdentifier">Base</span>
  validate <span class="synIdentifier">:name</span>, <span class="synIdentifier">:unique</span> =&#62; <span class="synConstant">true</span> 
<span class="synPreProc">end</span>
</pre>
<p>ActiveRecord の↑のようなモデルの spec として、<a href="https://github.com/thoughtbot/shoulda-matchers" target="_blank">shoulda-matchers</a> の validate_uniquness_of を使うことがある。</p>
<p>このときこんな風に書くと、場合によって通ったり通らなかったりするので注意が必要。</p>
<pre class="syntax-highlight">
describe <span class="synIdentifier">User</span> <span class="synStatement">do</span>
   it { should validate_uniqueness_of(<span class="synIdentifier">:name</span>) }
<span class="synStatement">end</span>
</pre>

<p>validate_uniquness_of のドキュメントには以下のようにある。</p>
<blockquote title="https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_uniqueness_of_matcher.rb" cite="https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_uniqueness_of_matcher.rb">
<pre>
      # Internally, this uses values from existing records to test validations,
      # so this will always fail if you have not saved at least one record for
      # the model being tested, like so:
      #
      #   describe User do
      #     before(:each) { User.create!(:email =&#62; 'address@example.com') }
      #     it { should validate_uniqueness_of(:email) }
      #   end
</pre>
<cite><a href="https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_uniqueness_of_matcher.rb" target="_blank">https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_uniqueness_of_matcher.rb</a></cite></blockquote>
<p>てなわけで、（ factory girl と組み合わせて )  こんな感じでないと安定しなかった。</p>
<br>

<pre class="syntax-highlight">
describe <span class="synIdentifier">User</span> <span class="synStatement">do</span>
  before { create <span class="synIdentifier">:user</span> }  
  it { should validate_uniqueness_of(<span class="synIdentifier">:name</span>) }
<span class="synStatement">end</span>
</pre>

<p>元のでも他の spec の都合でレコードが残ってたりする場合に通ったりするので、「手元で通るけど jenkins だと通らないよ！」というパターンになるので要注意。</p>
</div>
]]></content:encoded>
<dc:creator>holysugar</dc:creator>
<dc:date>2011-11-07</dc:date>
<dc:subject>Rails</dc:subject>
</item>
</rdf:RDF>

