前提・実現したいこと
Ruby 2.4.5
Rails 4.2.8
本番環境:heroku postgreSQL
開発環境:mySQL
friendly_idを利用し、サイト名/users/:idをサイト名/(好きな文字列)にユーザー自身で設定できるようにしています。
friendly_idについて
しかし、ユーザー登録時にはfrinedly_idを設定していないため、デフォルトだと、サイト名/users/1のように連番になります。
これを防ぐために(ユーザビリティ的によくない)、サイト名/users/(ランダム文字列)をデフォルトにしようとしています。
そこで、urlランダム文字列の実装とfriendly_idのGemがバッティングしているようでエラーが出ています。
Userテーブルに、url_tokenというカラムを追加しランダムな文字列を追加します。
それを:idの連番の代わりにデフォルトのルーティングとして用いるということです。
発生している問題・エラーメッセージ
エラー文
ruby
1undefined method `type' for :string:Symbol 2 3 def correct_user 4 user = User.friendly.find_by(url_token: params[:url_token]) #ここがダメ 5 if current_user != user 6 redirect_to root_path 7 end 8 end
該当のソースコード
user_controller
ruby
1 def show 2 #@user = User,friendly.find(params[:id])もともとこれ 3 @user = User.friendly.find_by(url_token: params[:url_token]) 4 @items = @user.items 5 @image = Image.includes(:user).order("created_at").last 6 end
ルーティング
Routes.rb
ruby
1 devise_scope :user do 2 get '/:id/' => 'users#show', as: 'show', param: :url_token #param以下を追加 3 get '/:id/edit' => 'users#edit', as: 'edit', param: :url_token #param以下を追加 4 put '/:id/' => 'users#update', as: 'update', param: :url_token #param以下を追加 5 get '/users/sign_out' => 'devise/sessions#destroy' 6 end
Userモデル
User.rb
ruby
1# url_tokenに対する設定を追加 2 before_save :generate_url_token 3 attribute :url_token, :string, default: SecureRandom.hex(10) 4 5#(省略) 6 7 #friendly_url 8 include FriendlyId 9 friendly_id :friendly_url 10 11 validates :friendly_url, length: { in: 3..20 }, 12 uniqueness: true, #一意性 13 format: { with: /\A[\w@-]*[A-Za-z][\w@-]*\z/ }, 14 # on: :friendly_url_user #登録時に入力必要なし 15 allow_nil: true #無入力許可 16 17 # url_tokenに対してのvalidation 18 validates :url_token, presence: true, uniqueness: true 19 def to_param 20 url_token 21 end 22 23#ログイン時にnillの場合生成する 24 def generate_url_token 25 if url_token.nil? 26 self.url_token = SecureRandom.hex(10) 27 self.save 28 end 29 end
試したこと
friendly_idのGemが便利な分、裏側でどう動いているのかが分かっていないのが現状です。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。