【rails】【ruby】rails4では当たり前?今日学んだこと(Strong Parametersなど)
今日は主にこんなことを学んだ、学び直しました。
基本
config/routes.rbに
:except => [:destroy]が書かれていたら
7つの基本アクションの中で不要なアクションを指定している
(この場合は「destroy」)ことを表している。
rails3とrails4での差分
名称が変更されていたskip_before_filter
rails3の場合
before_filter :search_date, :only => [:index, :search]
rails4の場合
before_action :search_date, only: [:index, :search]
strong parameterの実装
rails3の場合
view
<%= form_tag(action: :search, method: :put, class: "form-horizontal seperator", role: "form") do %><div class="form-group"><label class="col-lg-4 control-label" for="g08m11_task_date"><%= t("activerecord.attributes.g08m11_task.start_at") %>:</label><div class="col-lg-8"><%= text_field :search_date, :ut_start_date, {:class => "form-control"} %></div></div><!-- End .form-group --> <div class="form-group"><div class="col-lg-offset-11"><button type="submit" class="btn btn-info marginR10 marginL10"><%= t("functions.search") %></button></div></div><!-- End .form-group --> <% end %>
controller
private search_date if params[:search_date][:ut_start_date].blank? //params[:search_date][:ut_start_date]がnilだった場合に行い処理を記述 end end
問題点
パラメータの中身を勝手に変更できてしまうということになる。
この脆弱性をMass Assignment脆弱性というらしい。
それを防ぐために、rails4からStrongParametersなるものが出来た。
rails4の場合
view
<%= form_tag(action: :search, method: :put, class: "form-horizontal seperator", role: "form") do %> <div class="form-group"> <label class="col-lg-4 control-label" for="g08m11_task_date"><%= t("activerecord.attributes.g08m11_task.start_at") %>:</label> <div class="col-lg-8"> <%= text_field :search_date, :ut_start_date, {:class => "form-control"} %> </div> </div><!-- End .form-group --> <div class="form-group"> <div class="col-lg-offset-11"> <button type="submit" class="btn btn-info marginR10 marginL10"><%= t("functions.search") %></button> </div> </div><!-- End .form-group --> <% end %>
controller
private search_date if date_search_params[:ut_start_date].blank? //params[:search_date][:ut_start_date]がnilだった場合に行いたい処理を記述 end end def date_search_params return Hash.new unless params.key?(:search_date) params.require(:search_date).permit(:ut_start_date) end
Strong Parametersの基本
params.require(key).permit(filter)# key # Strong Parameters を適用したい params の key を指定する。 # filter # Strong Parameters で許可するカラムを指定する。
fetch()を使えばデフォルト設定も出来るらしいけど、
それだったら「strong parameter の用途として何かおかしい」と
思うので別メソッドで判定を行うロジックにしています。
このあたりは趣味やチームのポリシーに合わせて変更して頂けたらと
思います。
書き方分からなくてはまる前に
この記事を思い出して頂けたら幸いです。
参考サイト
http://o.inchiki.jp/obbr/181#toc_1
お知らせ
現在、このハッカソンに参加しています!
ざひ、会場でお会いしましょう!
「chiroru news」というwebアプリで参加します!
内容は会場で!