はじめに
続きを読みたかったら無料会員登録してねってよくある感じの機能を実装したいと思い、試行錯誤してやりました。初心者が試行錯誤した感じなのでもっといいやり方があるよって方はぜひコメントください。
データの構成
Articleモデルに、紐づいて、Itemモデルが多数あります。見出しと本文はItemモデルに入れるようになっています。
article.rb
# title :string(255)
class Article < ActiveRecord::Base
has_many :items
end
item.rb
# head :string(255)
# body :text
class Item < ActiveRecord::Base
belongs_to :article
end
続きを読みたかったら登録してねの実装
ユーザーがログインしているかどうかはdeviseで実装しています。
/articles/show.html.erb
<% if user_signed_in? %>
<%= render "_article" %>
<% else %>
<%= render "_require_login" %>
<% end %>
_require_login.html.erb
<% num = 0 %>
<% @article.items.each do |item| %>
<% num = num + item.body.size %>
<% if num < 400 %>
<h2><%= item.head %></h2>
<div><%= item.body %></div>
<% elsif num - item.body.size < 400 %>
<h2><%= item.head %></h2>
<div><%= truncate(item.body), length: 400 - (num - item.body) %></div>
<% end %>
<% end %>
<% if num > 400 %>
<% link_to "無料会員登録して続きを読む", hoge_path %>
<% end %>
文字数をカウントするために、viewでnum = 0を定義しました。その上で、numが400文字までは普通に表示します。
始めに400文字をオーバーしてしまう段落については、見出しと400文字未満までの文字をtruncateで見せてあげます。
その後400文字以上の部分については会員登録して読んでねとリンクを貼ってあげて終了です。続きを読む部分を曇りガラス的にぼかすCSSについてはこちらのページを参考にしました。
CSS3で画像の一部をiOS(曇りガラス)風にぼかす方法:レスポンシブ対応
最後に
何だかviewにロジックをゴリゴリ書く感じがあんまりよくないなーと思いながらも実装できたのでよしとしようかと思っています。もっといいやり方があれば指摘していただけるとうれしいです!