質問: 現在、記事のプレビュー機能を実装しようと考えています。 Rails のバージョンは 4.2.6 でデータベースには MySQL 5.5 を使用しています。 知りたいこと ------ プレビュー機能の仕様については以下の通りです。 **プレビュー機能の仕様** 1 記事編集画面でプレビューボタンを押すと別タブで現在入力された内容を表示する 2 プレビュー用のURLを発行し、そのURLからほかの人も同じプレビューを閲覧できる たとえば、プレビュー用のURLは以下のようになります。 オリジナルURL:/posts/12345 プレビューURL:/posts/12345?preview=true 仕様については WordPress と似ているかもしれません。 1の実装方法は既に把握しているので、今回は2の方法について知りたいです。 データベースの構成 --------- データベースの構成は以下の通りです。 ``` users - id: integer - email: string - name: string posts - id: integer - title: string - content: text - user_id: integer - updated_at: datetime posts_tags - id: integer - tag_id: integer - post_id: integer tags - id: integer - name: string ``` 考えたこと ----- プレビュー機能の実装方法について以下のような方法を考えました。 まず、以下のようなプレビュー用テーブルを用意します。 ``` preview_posts - id: integer - post_id: integer - title: string - content: text - user_id: integer - updated_at: datetime preview_posts_tags - id: integer - tag_id: integer - post_id: integer ``` 記事の新規作成ボタンを押すのと同時に空の `post` レコードを作成します。 これはプレビュー時に使用する URL (post_id) を作成するためです。 今後、保存時にはこの `post_id` のレコードに保存していきます。 また、プレビューボタンが押されたときに、 `preview_posts` テーブルにデータを保存し そのデータをプレビューとして表示します。 もしプレビュー表示の URL にアクセスした場合に、プレビュー用のレコードがなかったり、 `posts` テーブルに保存されている更新日時が `preview_posts` の更新日時より新しければ、 `posts` に保存されている内容をプレビューとして表示します。 **この方法の問題点** 1 新規作成時に ID を発行するので、無駄に `post_id` を消費してしまう。 2 元のテーブルの構成が変更されるたびにプレビュー用のテーブルも変更しなければならない。 記事の新規作成の頻度はそれほど多くないので、1はそこまで問題にならないかもしれません。 記事のテーブル構成は今後頻繁に変更する可能性があり、テーブルの変更だけでなく Active Record のリレーションなどの設定もしなければならないので、2は特に問題になると思います。 paper_trail などのバージョン管理用の gem を使用し、 プレビュー機能を実装することも検討しましたが、少しオーバースペックかなと思いました。 私が掲示した方法に関係なく、もし良い方法がありましたらご教授いただけると幸いです。
回答: ``` /posts/preview?title=XXX&content=YYY&... ``` というような URL で `posts#preview` アクションを起こして,このアクションでは 1. `create` アクションのようにパラメーターを受け取り,`Post.new` して `@post` に収める(`save` はしない) 2. 必要なら `created_at` を適当にセットする 3. `show` アクションのように `@post` を表示する という設計でどうでしょうか。