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

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

ただいまの
回答率

90.47%

  • Ruby

    9656questions

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

  • Ruby on Rails 4

    2550questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

rails4でのフォロー機能|gemはacts_as_followerを利用

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 832

yoshimitsu41

score 24

Rails 4.2.6
ruby 2.3.1
mysql
で出会い系のWEBアプリケーションを勉強を兼ねてで構築しています。
rails初心者です。

やりたいこと

ユーザーのshowアクションから
ユーザー同士がお気に入りボタンを押してお気に入りに追加できるようにしたい。

ルーティング
  Rails.application.routes.draw do
  #devise_for :users
  devise_for :users do
    member do
      get :follow
      get :unfollow
    end
  end
    root 'homes#index' #root_path
    get 'flow' => 'flows#index'
    get 'messages' => 'messages#index'
    get 'profiles' => 'profiles#index' #プロフィールの一覧
    get 'profiles/show' => 'profiles#show'   #プロフィールの詳細内容
    get 'profiles/new' => 'profiles#new'   #プロフィールの登録画面
    post 'profiles' => 'profiles#create'   #プロフィールの登録画面
    get 'profiles/:id/edit' => 'profiles#edit'
    patch 'profiles/' => 'profiles#update'
    get 'users/:id' => 'users#show' #mypageへのルーティング
    get 'users' => 'users#index' #mypageへのルーティング
  end
Model

Userモデル(Deviseのgemを利用)

  • id
  • email
  • password
  • nickname
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_one :profile
  acts_as_followable # フォロワー機能
  acts_as_follower   # フォロー機能
end

Profileモデル

  • id
  • user_id
  • age
  • mytype
  • pref
  • text
class Profile < ActiveRecord::Base
  mount_uploader :image, ImageUploader
  belongs_to :user
end

Followモデル(acts_as_followerのgemを利用)

  • id
  • followable_id
  • followable_type
  • follower_id
  • follower_type
class Follow < ActiveRecord::Base

  extend ActsAsFollower::FollowerLib
  extend ActsAsFollower::FollowScopes

  # NOTE: Follows belong to the "followable" interface, and also to followers
  belongs_to :followable, :polymorphic => true
  belongs_to :follower,   :polymorphic => true

  def block!
    self.update_attribute(:blocked, true)
  end

end


以上がmodel,db,各モデル.rbです。

ユーザーモデルとプロフィールモデルがアソシエーションで結ばれています。

Controller

user_controller.rb

class UsersController < ApplicationController
    before_action :move_to_index, only: :index

  def index
    @user = User.all
  end

  def show
    user = User.find(params[:id])
    @nickname = current_user.nickname
    @email = current_user.email
    @profile = user.profile
    @friend = User.find(params[:id])
    ##以下はフォロー用
    @me = current_user
    @all = current_user.all_following
    @user = User.find(params[:id])
  end

  def follow
      @user = User.find(params[:id])
      current_user.follow(@user)
      redirect_to root_path
  end

  private
  def move_to_index
    redirect_to '/users/sign_in',:flash => {:alart => "ご利用にはログインが必要です。会員登録がまだの方は会員登録を行って下さい。"} unless user_signed_in?
  end

end


profiles_controller.rb

class ProfilesController < ApplicationController

  def index
  end

  def new
    @nickname = current_user.nickname
    @email = current_user.email
  end

  def create
    Profile.create(birthday: profile_params[:birthday], bodytype: profile_params[:bodytype], mytype: profile_params[:mytype], pref: profile_params[:pref], text: profile_params[:text],image: profile_params[:image], user_id: current_user.id)
  end

  def show
    @nickname = current_user.nickname
    @email = current_user.email
  end

  def edit
    @profile = User.find(params[:id])
    @nickname = current_user.nickname
    @email = current_user.email
  end

  def update
    profile = Profile.find_by(user_id: current_user.id)
    profile.update(profile_params)
  end

  private
  def profile_params
    params.permit(:birthday, :bodytype, :mytype, :pref, :text, :image)
  end

end


です。

views/users/show.html.erbが下記です。
長いので該当の箇所だけ記載します。

<% if current_user.following?(@user) %>
お気に入り解除のボタン
<% else %>
お気に入りに登録する
<% end %>

上記のようにする場合どのようにしてお気に入り登録、または解除を実装すればよいでしょうか?
ちなみにacts_as_followerの使い方は下記を参考にしました。
http://qiita.com/kurkuru/items/ad25569f64e74efdac56#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB
初心者のコードですのでめちゃくちゃだとは思いますがご教授お願い致します。

追記---------------------------------------------------
<%= link_to "Follow", @me.follow(@user) %>
を追加するとエラーになったり、リンクをクリックしていないのにフォロー機能が勝手に動くことが有るのですが原因もわかりません。。。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

色々間違っているのはわかりました。
今度から初心者マークをつけてください。

簡単なwebアプリの仕組み

まず基本的なことから、webアプリは下記の4つから構成されます。

  • html5:HyperText Markup Languageインターネットの黎明期に学者が論文を共有するために作られた言語で、<tag></tag>で要素を管理する、それのversion5、デスクトップアプリに劣らないUIを備えた最新のもの
  • webフレームワーク:サーバーサイドに位置し、データ(DB)とユーザーからのアクションを結びつけブラウザ上にhtmlなどの結果を返す
  • javascript:webブラウザ上で動作する、軽量言語webブラウザ上で完結した動作をしたりwebフレームワークの動きを助けデータをやりとりしたりする
  • stylesheet:htmlにもデザインの機能はあるが、それを分離し、構造化したもの、通常、htmlのtagのclassやidを頼りにデザインを適用する。
    web開発をしっかりやろうと思ったら最低限これら4つを勉強しないといけません。

でも、これらをしっかり勉強しなくても、かなりレベルの高いソフトが作れてしまい、知識があればさらに
細かいカスタマイズが可能なのがwebフレームワークたるRuby on Railsなのです。

なぜ現在、期待した動作ができないか?(バグの説明)

以上を踏まえると、Ruby on Railsのコードが使えるのはサーバー上だけ、htmlを生成するところまでです。
なのでこれは

<%= link_to "Follow", @me.follow(@user) %>


htmlを作成するときにRuby on Railsのコードとして@me.follow(@user)が実行され
フォローが成功したら成功を知らせるtrueが帰って
<a herf='/true'>Follow</a>というhtmlが生成されます。
これをいくら押してもtrueというページに行こうとするだけで(そんなページはない)
何も起こりません(html作成時にすでにフォローはされていますがw)

じゃあ期待どうりにするにはどうすればいいのよ

やることは以下の3点です。
サーバー側でusers_controllerに、フォロー対象者を受け取ったら現在ログインしているユーザーでフォローする命令(プログラム)を書く。

  def follow
      @user = User.find(params[:user_id])
      current_user.follow(@user)
      redirect_to user_path(@user)
  end
  def unfollow
      @user = User.find(params[:user_id])
      current_user.stop_following(@user)
      redirect_to user_path(@user)
  end


※フォローした後に戻るページはユーザーの方がいいかなと思いuserに行くようになっています。

config/route.rbを編集してunfollowとfollowへの接続許可をだす。

put 'users/flow/:user_id' => 'users#flow'
put 'users/unflow/:user_id' => 'users#unflow'


サーバー側で押すとフォローしてくれるボタンを作る(この時必要な情報をボタンに渡す。)

<%= link_to "Follow", {controller: :users,action: :follow,user_id: @user.id}, method: :put %>
<%= link_to "UnFollow", {controller: :users,action: :unfollow,user_id: @user.id}, method: :put %>


※{controller: :users,action: :follow,user_id: @user.id}これはusers_controller.bのfollowというメソッド(命令に)user_idというパラメータに現在表示されているユーザーのidを渡して実行するという意味です。

最後に、生成されたボタンを押してください、うまく動くはずです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/24 13:44

    詳細なご回答ありがとうございます。
    非常に勉強になりました。
    更におっしゃるとおりコードを修正して動きました。
    そもそもの基礎が把握出来ていないのだなぁと痛感した次第です。
    ありがとうございました!

    キャンセル

  • 2017/04/24 14:45

    私も最初に全く同じようなコードを書いた覚えがあるのでw
    過去の自分への回答のつもりで書きました。
    基礎は重要ですが、プログラムも工業製品と同様、よりモジュール化
    して、高度化し、アイデアをすぐ形にできるようになっています。
    基礎を抑えるのも大事ですが、概念、仕組みを理解して、どんどんプロダクト
    を作る方が、学べることが多いと思います。
    頑張ってください

    キャンセル

  • 2017/04/24 15:57

    なるほど、どんどん触って経験値を積みます!ありがとうございます!

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    9656questions

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

  • Ruby on Rails 4

    2550questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。