0

ユーザーがプロジェクトを作成できるようにしようとしています...そして、ユーザーがプロジェクトを作成するとすぐに...彼らは自動的にそのプロジェクトをフォローします。(ユーザーがプロジェクトプロファイルの「フォロー」ボタンからプロジェクトをフォローできるようにアプリをセットアップしています)。プロジェクトの作成者が、[フォロー] ボタンをクリックしなくても、新しいプロジェクトを自動的にフォローできるようにしたいと考えています。Bilalの回答に従ってコードを再配置しました...しかし、「プロジェクトの作成」をクリックすると、単に「新しい」ビューが更新されます(プロジェクトは投稿されません)。これは Pundit の承認に関係していると思いましたが、おそらく誰かが「作成」アクションが機能しなくなった理由を明確にすることができます...

私のプロジェクト モデル:

class Project < ActiveRecord::Base
  belongs_to :owner, :foreign_key=>'user_id', :class_name=>'User'

  has_many :reverse_relationships, foreign_key: "followed_id",
                                   class_name: "Relationship",
                                   dependent: :destroy
  has_many :followers, through: :reverse_relationships, source: :follower

  validates :title, presence: true
  validates :background, presence: true
  validates :projectimage, presence: true

  mount_uploader :projectimage, ProjectimageUploader
  attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
  after_update :crop_projectimage

  def crop_projectimage
    projectimage.recreate_versions! if crop_x.present?
  end

  def private?
    self.is_private == true
  end

  def public?
    self.is_private == false
  end
end

関係モデル:

class Relationship < ActiveRecord::Base
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "Project"
  validates :follower_id, presence: true
  validates :followed_id, presence: true

  enum role: [:admin, :collaborator, :visitor]
  after_initialize :set_default_role, :if => :new_record?

  def set_default_role
    self.role ||= :visitor
  end
end

私のプロジェクト コントローラー:

class ProjectsController < ApplicationController
  before_filter :authenticate_user!, only: [:create, :new, :edit, :update, :delete, :followers]

  # CREATES REDIRECT & ALERT MESSAGE WHEN PUNDIT SEES SOMEONE IS NOT AUTHORIZED (via :not_authorized_in_project below)
  rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

  def new
    @project = Project.new
  end

  def show
    @project = Project.find(params[:id])
    authorize @project, :visit? 
    # @user = User.where(:id => @project.user_id).first
  rescue Pundit::NotAuthorizedError
    flash[:warning] = "You are not authorized to access this page."
    redirect_to project_path || root_path
  end

  def index
    @projects = policy_scope(Project).all
  end

  def create
    @project = current_user.own_projects.build(project_params)
    @project.followers << current_user
    if @project.save
      if params[:project][:projectimage].present?
        render :crop
      else
        flash[:success] = "You've successfully created a Project..."
        redirect_to @project
      end
    else
      render 'new'
    end
  end

  def update
    @project = Project.find(params[:id])
    if @project.update_attributes(project_params)
      if params[:project][:projectimage].present?
        render :crop
      else
        flash[:success] = "Project Created"
        redirect_to @project
      end
    else
      render 'edit'
    end
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "Project destroyed"
    redirect_to users_path
  end

  def followers
    @title = "Following this Project"
    @project = Project.find(params[:id])
    @project = @project.followers.paginate(page: params[:page])
    render 'show_follow_project'
  end

  private

  def project_params
    params.require(:project).permit(:title, :background, :is_private, :projectimage, :user_id, :crop_x, :crop_y, :crop_w, :crop_h)
  end

  def user_not_authorized
    flash[:warning] = "You are not authorized to access this page."
    redirect_to project_path(@project) || root_path
  end
end

私のユーザーモデル:

class User < ActiveRecord::Base
  has_many :own_projects, :class_name=>'Project'

  has_many :projects
  has_many :relationships, foreign_key: "follower_id", dependent: :destroy

  has_many :followed_projects, through: :relationships, source: :followed
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  def following?(some_project)
   relationships.find_by_followed_id(some_project.id)
  end

  def follow!(some_project)
   self.relationships.create!(followed_id: some_project.id)
  end

  def unfollow!(some_project)
   relationships.find_by_followed_id(some_project.id).destroy
  end

評論家のプロジェクト ポリシー:

class ProjectPolicy < Struct.new(:user, :project)
  class Scope < Struct.new(:user, :scope)
    # SCOPE & RESOLVE METHOD USED TO RESTRICT PROJECTS INDEX TO PUBLIC & THOSE YOU'RE AN ADMIN/COLLAB ON
    def resolve
      followed_project_ids = user.followed_projects.map(&:id)
      public_project_ids = Project.where(:is_private=>false).map(&:id)
      Project.where(:id=>followed_project_ids + public_project_ids)
    end
  end

    def update?
      user.project_admin? || user.project_collaborator?
    end


    # METHOD USED IN PROJECTS_CONTROLLER (SHOW) TO RESTRICT VISITING PRIVATE PROJECT PROFILES TO ADMINS & COLLABS
    def visit?
      user.project_admin?(project) || user.project_collaborator?(project)
    end

end
4

1 に答える 1

1

current_userモデルで使用することは決して良い考えではありません。参照用にこれを参照してください。

これを設定する簡単で効率的な場所は、コントローラー自体です。したがって、次のコードを記述できます。

def create
  @project = current_user.own_projects.build(project_params)
  @project.followers << current_user
  if @project.save
    if params[:project][:projectimage].present?
      render :crop
    else
      flash[:success] = "You've successfully created a Project..."
      redirect_to @project
    end
  else
    render 'new'
  end
end
于 2016-03-20T20:40:06.640 に答える