Web + Life Hack

〜True But Useless〜

【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アプリで参加します!
内容は会場で!

http://biz-iq.jp/rehack

  1. f:id:g08m11:20131214161645p:plain