Rails – link_toの動的なスタイル

概要

Railsのヘルパーでクラスを動的に変更する方法。<%...%>を入れ子にすることができないが、文字列内の変数展開を使えば、変数の内容をクラスに設定できる。

コントローラー

コントローラーでインスタンス変数の配列を定義し、その内容によってlink_toのスタイルを変更する。

ビュー

インスタンス変数の配列の各要素を取り出しながら、

  • 変数availabilityenabled/disabledを設定
  • link_toのclass設定で変数availabilityを文字列展開

この結果、HTMLソースは以下の様になる。

スタイル

クラスに設定されるenabled/disabledに対してスタイルを設定する

実行結果

disableを設定したリンクの色が薄くなっている。また、このリンクを無効にしたので、クリックしてもコンソールに反応が出ない。

Rails – 掲示板 – 新規投稿機能

概要

新規投稿ページの枠組みをつくったので、これに投稿機能を実装する。

掲示板の第2段階へ

準備

投稿画像ディレクトリー

投稿画像ファイル保存用のディレクトリーを作成する。

public/post_images

ビュー

新規投稿のnewビューは再掲。

コントローラー

post_paramsヘルパー

ビューのフォームからパラメーターを受け取る際のヘルパーで、コントローラーで扱うパラメーターを許可している。

:upload_fileは直接保存しないので含めていない。

createアクション

フォーム入力を受けて投稿記事を生成・保存する本体。ファイルのアップロードについてはこちらを参照。

  • 記事を投稿したユーザーをデータベースから拾っている(L7)
  • メッセージか画像かどちらかがあれば投稿できる(L10-13)

app/controllers/posts_controllers.rb

メッセージと画像、メッセージのみ、画像のみの投稿後のデータベースの例は以下のとおり。

 

Rails – バリデーターのカスタマイズ

概要

モデルの検証を行うバリデーターを自作するのにいくつかの方法がある。

  • バリデーションメソッドをモデルで定義
  • ActiveModel::Validatorのサブクラスを定義
  • ActiveModel::EachValidatorのサブクラスを定義

バリデーションメソッド

検証したいモデルの中でカスタムメソッドを定義し、validate(単数形)でメソッドを呼び出す。

以下のコードは、:name属性と:email属性を持つUserモデルをカスタムメソッドにより検証する例。

 

  • カスタムメソッドname_or_email_presentsを定義
  • メソッドでは、:name:emailの両方とも空の場合にエラーを追加
  • モデルでvalidateによってメソッドをコールバックとして追加(validateは単数形)

ActiveModel::Validator

ActiveModel::EachValidator

 

Rails – 掲示板 – 新規投稿ページ

概要

サインインユーザーによる新規記事投稿のページを実装していく。

  • サインインユーザーがメニューアイコンをクリックして新規投稿ページへ
    • 新規投稿ページでは、メッセージを入力、画像ファイルを指定
    • サインインしていないユーザーに対してはアクセス制限
  • ここではresourcesによるRails標準のルーティングを使う
  • コントローラーはPostsController.rb

掲示板の第2段階へ

ルーティング

コントローラーに対応したpostsについてresourcesでルーティングを設定する。

config/routes.rb

resourcesにより設定されたルーティングは以下のとおり。

rails routes

コントローラー

PostControllerコントローラーを生成する。アクションについては、生成後のコントローラーファイルを編集することとして、ここでは枠組みだけを生成。

rails generate controller posts

生成されたコントローラーファイルにアクションを追加。

  • new
    • 他画面から遷移して投稿画面をレンダリング
    • ビューで扱うモデルはPostなので、@postUserのインスタンスをいれておく
  • create
    • 投稿画面からのPOSTにより処理が渡され、投稿記事の新規作成処理を行う

またアクション実行前にauthorizeをコールバック登録し、アクセス制限をかけている。

app/controllers/posts_controller.rb

ビュー

newアクションによりレンダリングされるページのコード。

メッセージ入力用のtext_areaとファイル選択用のfile_field、送信用のボタンを配置する。

views/posts/new.html.erb

スタイル

ビューに対する最低限のスタイルを設定。

app/assests/stylesheets/posts.scss

リンク設定

サインインユーザー用ヘッダーメニューのアイコンから記事投稿ページへのリンクを設定。

app/views/layouts/application.html.erb