ztbuz@devスマートフォン用の表示で見るztbuz@dev人生に絶望しているZが、それでも技術を身につけようと必死になるブログこの広告は、90日以上更新していないブログに表示しています。Parametersというものが導入されたのですね。Assignment脆弱性なるものを突かれた、という経緯があるらしいです。Parametersの使い方についてまとめました。Assignment脆弱性とはたとえば、以下の内容がフォームからPOSTされたとします。}それを、このようにしてupdateしたとします。処理endこのままだと特に問題ないように思えます。......が、不正なフォームの使用などにより、以下のような内容がPOSTされるとします。3まではattr_accessibleで受け取るパラメータをホワイトリスト指定できたのですが、これを知らない開発者は:tokenの更新を許容してしまう、という問題です(たぶん)。Parameters、という訳です。Parametersとは以下のように、params[:user]を直接渡すのではなく、以下のように一度フィルタリングします。endrequireは、ここで指定したキーを持っている場合のみ値を返します。permitは、ここで指定したシンボルのみを返します。先ほどの不正な値がPOSTされた場合でも、ここで:tokenをpermitしていなければ、値が変えられることはない、ということです。朗報だね(ニッコリ)。Railsを学んでいると度々出てくるflashについて、しっかり学ぼうと思い、使い方をまとめてみました。基本的な使い方コントローラでflashをセットまず、以下のようにflashにメッセージをセットします。'アカウントを作成しました。'アカウントを作成しました。}ビューでflashを表示あとは、以下のようにflashを表示させるだけです。content_tagを使うとスッキリします。%>生成されるHTML生成されるHTMLは以下のようになります。flash-success">アカウントを作成しました。</div>flashのメソッド以下に詳しいのですが、特徴的なものをいくつか書きます。GuidesActionDispatch::Flash::FlashHashflash.nowflash.nowは、そのアクションでflashを消す際に用います。先ほど以下のように書きました。'アカウントを作成しました。'普通はこれでよいのですが、たとえばrenderでビューを指定すると、アクションが進む訳ではないので、flashが2回表示されることになります。これを避けるために、flash.nowを用います。'アカウントを作成しました。'flash.keepこれは、flashを保持したいときに用います。通常であれば消えるところを、flash.keepを用いることによって、次のアクションまで保持することができます。保持するflash.discarddiscardは「破棄する」という意味ですが、その名のとおりflashを破棄します。破棄するおわりにflashを効果的に使うとユーザビリティが向上すると思うので、しっかり使いこなせるようになります。Railsチュートリアルを完了しました。それで、ちょっとごちゃごちゃしてきたので、ユーザ登録〜ログイン機能までの実装のみを抜き出して自分なりに整理してみました。ちなみに今回長くなるのでバリデーションやテストは省略しています。編集するファイルは以下のような感じです。routes.rbテーブルテーブルは以下のようにUserモデルのみ利用します。ERDを用いて生成しました(なんつー誤字だ......)。上記を準備するコマンドとりあえずパパパパーンッと上記を準備します。install各ファイル各ファイルの中身と、コメントをちらほら記します。それではディレクトリ構成の上から順に(適当)。application_controller.rbコントローラ全体からSessionsHelperを呼び出すことになるので、ここでこれをincludeしておきます。SessionsHelperendsessions_controller.rbSessionコントローラはその名のとおりセッションを司ります。RESTな考えでいくと、newはログインフォーム、createはログイン処理、destroyはログアウトですね。endendusers_controller.rbこちらはよくあるUserコントローラです。今回はeditとupdateのみ権限を課しているので、before_actionでそれっぽいことをします。endendsessions_helper.rb今回のメインっぽい部分。ログイン時にトークンを更新して、以降は該当するトークンをfindしてcurrent_userにセットします。この辺でインスタンスメソッドとクラスメソッドの理解がだいぶ深まりました。endenduser.rbUserモデル。このhas_secure_passwordがいろいろよしなにやってくれます。いうかやってくれ過ぎでしょ。後ろ2つはインスタンスに関係ない部分なのでクラスメソッドとして実装しています。endendapplication.html.erbここからはただのViewです。application_controller.rbでSessionsHelperをincludeしたので、signed_in?で便利に振り分けることができます。%></body></html>sessions/new.html.erb何の変哲もないViewです。Sessionはモデルがないので、form_forがちょっと特殊です。%>users/edit.html.erbこれもただのViewです。%>users/index.html.erbただ一覧を表示するだけです。link_toでuserを渡すとshowしてくれるらしいです。この辺のRailsのノリについていけない。%></ul>users/new.html.erbそのうちPartialの記事も書きます。%>users/show.html.erb自分のプロフィールページのみ、編集リンクを表示するようにします。%>routes.rbこの辺は無抵抗に書きます。'users#index'endおわりに以上です。便利なGemにdeviseとかcancanとかあるらしいですが、私みたいなシロウトはまず自分で書いて理解しなければならないと思うのです。equal演算子の使い方Rubyには、以下のような書き方があるらしいです。equal演算子と呼ぶらしいのですが、これについて動きなどを調べてみたのでメモします。以下のコードについて、or_equal(name)の部分がそれにあたります。これはつまり、インスタンス変数@nameが存在すればそれを返し、なければ引数のnameを返す、という動きになります。endendインスタンス変数がない場合name=(name)でインスタンス変数を生成しない場合、そのままor_equal(name)の引数が返ります。"foo"インスタンス変数がある場合name=(name)でインスタンス変数を生成した場合、or_equal(name)の引数によらず、@nameが返されます。"bar"おわりに使い方が分かりやすいですし、使いこなせればコードがシンプルになると思うので、積極的に使っていこうと思います。コードを書く時間を確保しよう。equal演算子の使い方Tweet広告を非表示にするもっと読むコメントを書く2013-12-29Rubyのイコールを用いた要素代入関数の書き方Rubyでは、関数名にイコールを使えると風のうわさで聞きました。その書き方についてのメモです。以下のようなコードがあるとします。この中のname=を要素代入関数というらしいです。要素代入関数とは、簡単にいうと「代入演算子(=)を用いて引数を渡せる関数」だと思います。endend代入する上のコード例について、インスタンスの生成〜代入までは以下のように書きます。すると、@nameというインスタンス変数が生成されます。'foo'インスタンス変数を表示するで、こうすると、インスタンス変数が表示される、という訳です。同じnameという名前を持つ関数なのに、=の有無で違うメソッドが呼び出されるんですね(当たり前)。"foo"おわりにRubyは書き方がいろいろあって、PHPすらまともに書いたことのない私は心底絶望しています。Railsの学習中にModel周りで悩んでしまったのでメモ。self.〜ってなんぞ?」という話についてです。インスタンスメソッドとクラスメソッドの使い分けコード例たとえば、以下のようなコードがあるとします。このとき、self.barがクラスメソッド、bazがインスタンスメソッドとなります。endendインスタンスメソッドインスタンスメソッドとは、newでインスタンスを生成したときにのみ呼び出せるメソッドです。生成するインスタンスによって異なる結果を返す場合に用いる、といったところでしょうか(となると上のコード例は微妙ですね......)。"baz"クラスメソッドクラスメソッドとは、ダブルコロン(::)によってクラス経由で直接呼び出すメソッドです。返る結果がインスタンスによらず一定の場合に用いる、という感じだと思います。(NoMethodError)また、インスタンスメソッドからクラスメソッドを呼び出すには、以下のように書きます。"bar"endおわりに昔Javaを少し学んでいたときに曖昧にしていたのですが、改めて学習したことで理解が深まりました。次の記事を書き始めます。Railsをお勉強中なのです。ところどころ出てくるメソッドの!と?について、すこし整理してみます。感嘆符「!」これは破壊的メソッドを表します。Rubyのリファレンスには、以下のようにあります。「!」はメソッド名の一部です。tr!)で使われます。sort関数の場合、以下のようになります。5]一言で言うと「メソッドを呼びだしたオブジェクト自身が影響を受ける」、という感じでしょうか。疑問符「?」これは真偽値を返すメソッドを表します。Rubyのリファレンスには、以下のようにあります。この場合の「?」はメソッド名の一部分です。慣用的に、真偽値を返すタイプのメソッドを示すために使われます。これは直感的に分かりやすいです。falseおわりに自分でメソッドを定義するときは、この2点をしっかりおさえて作るようにします。11:21Rubyの関数名の感嘆符「!」と疑問符「?」の意味Tweet広告を非表示にするもっと読むコメントを書く次のページプロフィールid:ztbuz人生に絶望しているZです。そこには、深い理由があるのです。ひとつだけ言えるのは、私はエンジニアなどではない、ということです。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。