質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

0回答

1478閲覧

railsチュートリアルのサンプルアプリでいいね機能を実装

tahataha

総合スコア7

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/07/05 08:25

前提・実現したいこと

現在Railsチュートリアルのサンプルアプリにて、投稿にいいねできる機能を実装しようとしています。
ググりながら必要なモデル等を作成し、コードを書いたつもりなのですが、アプリのプレビューでアイコン等が一切表示されない状況です。

発生している問題・エラーメッセージ

特にエラーがでて怒られる訳ではないですが、
アプリをテスト環境で動かしてみたところコードを書いたいいね機能が反映されていない状況です。

該当のソースコード

ruby

1#マイグレーションファイル 2 3class CreateLikes < ActiveRecord::Migration[5.1] 4 def change 5 create_table :likes do |t| 6 t.integer :user_id , null: false 7 t.integer :micropost_id, null: false 8 9 t.timestamps 10 11 t.index :user_id 12 t.index :micropost_id 13 #複数キーインデックス。user_idとmicropost_idの組み合わせが必ずユニークであることを保証し、 14 #1人のユーザーが投稿に複数回いいねすることを防ぐ。 15 t.index [:user_id, :micropost_id], unique: true 16 end 17 end 18end 19

ruby

1#user.rb 2 3class User < ApplicationRecord 4 has_many :microposts, dependent: :destroy 5 #フォロー 6 has_many :active_relationships, 7 class_name: 'Relationship', 8 foreign_key: :follower_id, 9 dependent: :destroy 10 has_many :passive_relationships, 11 class_name: 'Relationship', 12 foreign_key: :followed_id, 13 dependent: :destroy 14 # @user.active_relationships.map(&:followed) 15 # @user.following 16 has_many :following, 17 through: 'active_relationships', 18 source: 'followed' 19 has_many :followers, 20 through: 'passive_relationships', 21 source: 'follower' 22 #いいね機能 23 has_many :likes, dependent: :destroy 24 #「参加を表明する」機能 25 has_many :joins, dependent: :destroy 26 27 attr_accessor :remember_token, :activation_token, :reset_token 28 before_save :downcase_email 29 before_create :create_activation_digest 30 31 32 validates :name, presence: true, length: { maximum: 50 } 33 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i 34 validates :email, presence: true, length: { maximum: 255 }, 35 format: { with: VALID_EMAIL_REGEX }, 36 uniqueness: { case_sensitive: false } 37 has_secure_password 38 validates :password, presence: true, 39 length: { minimum: 6 }, allow_nil: true 40 41 def User.digest(string) 42 cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 43 BCrypt::Engine.cost 44 BCrypt::Password.create(string, cost: cost) 45 end 46 47 def User.new_token 48 SecureRandom.urlsafe_base64 49 end 50 51 def remember 52 self.remember_token = User.new_token 53 self.update_attribute(:remember_digest, 54 User.digest(remember_token)) 55 end 56 57 def forget 58 self.update_attribute(:remember_digest, nil) 59 end 60 61 # 渡されたトークンがダイジェストと一致したらtrueを返す 62 def authenticated?(attribute, token) 63 digest = self.send("#{attribute}_digest") 64 return false if digest.nil? 65 BCrypt::Password.new(digest).is_password?(token) 66 end 67 68 def activate 69 update_attribute(:activated, true) 70 update_attribute(:activated_at, Time.zone.now) 71 end 72 73 def send_activation_email 74 UserMailer.account_activation(self).deliver_now 75 end 76 77 def create_reset_digest 78 self.reset_token = User.new_token 79 update_attribute(:reset_digest, User.digest(reset_token)) 80 update_attribute(:reset_sent_at, Time.zone.now) 81 end 82 83 def send_password_reset_email 84 UserMailer.password_reset(self).deliver_now 85 end 86 87 def password_reset_expired? 88 reset_sent_at < 2.hours.ago 89 end 90 91 92 def feed 93 following_ids = "SELECT followed_id FROM relationships 94 WHERE follower_id = :user_id" 95 Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", 96 user_id: self.id) 97 end 98 99 def follow(other_user) 100 self.active_relationships.create(followed_id: other_user.id) 101 end 102 103 def unfollow(other_user) 104 self.active_relationships.find_by(followed_id: other_user.id).destroy 105 end 106 107 def following?(other_user) 108 self.following.include?(other_user) 109 end 110 111 private 112 113 def downcase_email 114 self.email = self.email.downcase 115 end 116 117 def create_activation_digest 118 self.activation_token = User.new_token 119 self.activation_digest = User.digest(self.activation_token) 120 # @user.activation_digest => ハッシュ値 121 end 122end
#micropost.rb class Micropost < ApplicationRecord enum tag: { bussiness: 1, art: 2, development: 3, sport: 4 } ALLOWED_PARAMS = [:id, :title, :tag, :text] belongs_to :user #いいね機能 has_many :likes, dependent: :destroy has_many :iine_users, through: :likes, source: :user has_many :joins, through: :joins, source: :user default_scope -> { order(created_at: :desc) } mount_uploader :picture, PictureUploader validates :user_id, presence: true validates :title, presence: true validates :tag, presence: true validates :text, presence: true validate :picture_size #マイクロポストをいいねする def iine(user) likes.create(user_id: user.id) end #マイクロポストのいいねを解除する def uniine(user) likes.find_by(user_id: user.id).destroy end def iine? iine_users.include?(user) end #プロジェクトに対して「参加の意思」を表明する def sanka(user) joins.create(user_id: user.id) end #マイクロポストの参加を解除する def unsanka(user) joins.find_by(user_id: user.id).destroy end #現在のユーザーがいいねしてたらtrueを返す def sanka?(user) sanka_users.include?(user) end private # アップロードされた画像のサイズをバリデーションする def picture_size if picture.size > 1.megabytes errors.add(:picture, "should be less than 1MB") end end end

ruby

1#like.rb 2 3class Like < ApplicationRecord 4 belongs_to :user 5 belongs_to :micropost 6 counter_culture :micropost 7 validates :user_id, presence: true 8 validates :micropost_id, presence: true 9end

ruby

1#routes.rb 2 3Rails.application.routes.draw do 4 . 5 . 6 . 7 resources :likes, only: [:create, :destroy] 8 . 9 . 10 . 11end

ruby

1#likes_controller.rb 2 3class LikesController < ApplicationController 4 before_action :logged_in_user 5 6 def create 7 @micropost = Micropost.find(params[:micropost_id]) 8 unless @micropost.iine?(current_user) 9 @micropost.iine(current_user) 10 @micropost.reload 11 respond_to do |format| 12 format.html { redirect_to request.referrer || root_url } 13 format.js 14 end 15 end 16 end 17 18 def destroy 19 @micropost = Like.find(params[:id]).micropost 20 if @micropost.iine?(current_user) 21 @micropost.uniine(current_user) 22 @micropost.reload 23 respond_to do |format| 24 format.html { redirect_to request.referrer || root_url } 25 format.js 26 end 27 end 28 end 29end 30

ruby

1#_micropost.html.erb 2 3<li id="micropost-<%= micropost.id %>" data-micropost-id="<%= micropost.id %>"> 4. 5. 6. 7 <span class="timestamp"> 8 . 9 . 10 . 11 </span> 12 <%= render "likes/like", micropost: micropost %> 13</li>

ruby

1#_like.html.erb 2 3<% if !current_user?(micropost.user) %> 4 <span class="like"> 5 <% if micropost.iine?(current_user) %> 6 <%= form_for(micropost.likes.find_by(user_id: current_user.id), method: :delete, remote: true) do |f| %> 7 <%= button_tag(class: "btn btn-default btn-xs") do %> 8 <%= content_tag :span, "#", class: "glyphicon glyphicon-heart" %> 9 <% end %> 10 <% end %> 11 <% else %> 12 <%= form_for(micropost.likes.build, remote: true) do |f| %> 13 <div><%= hidden_field_tag :micropost_id, micropost.id %></div> 14 <%= button_tag(class: "btn btn-default btn-xs") do %> 15 <%= content_tag :span, "#", class: "glyphicon glyphicon-heart-empty" %> 16 <% end %> 17 <% end %> 18 <% end %> 19 </span> 20<% end %> 21

試したこと

原因が分からず、対処しあぐねている状況です。
お力お菓子いただけるととても助かります!!

補足情報(FW/ツールのバージョンなど)

ruby 2.4.1
ruby on rails 5.1.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryochin

2018/07/07 02:11

開発環境であるなら、環境変数 RAILS_SERVE_STATIC_FILES を設定してみるとどうなるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問