2016-03-20 6 views
0

ユーザーがプロジェクトを作成できるようにしようとしています。ユーザーがプロジェクトを作成するとすぐに、自動的にそのプロジェクトに従います。 (私は、ユーザーがプロジェクトプロファイルの「フォロー」ボタンからプロジェクトをフォローできるようにするためのアプリケーションをセットアップしています)。私はプロジェクトの作成者が自動的に新しいプロジェクトに従うことを望んでいますが、 'follow'ボタンをクリックする必要はありません。 Bilalの答えに従ってコードを整理しました...しかし、今度は「プロジェクトを作成」をクリックするだけで、「新しい」ビューが更新されます(プロジェクトはポストされません)。プロジェクト作成後の後続関係After_create

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 
+1

質問を投稿するときは、追いかけてみてください。この量のコードは完全に不要です(全コントローラー/モデルを投稿する必要はありません)。 – Waclock

+1

hah申し訳ありませんが、男性は将来行います。過去の記事では、より多くのコードを投稿するための回答を得ることになりました。 – BB500

答えて

1

それは参考のためにthisを参照して、モデルに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 
+0

Bilalに感謝します。しかし、これを追加すると(モデルからafter_createとメソッドを削除する)、プロジェクトを作成する際に問題が発生しています。単に「新しい」プロジェクトビューをリフレッシュし、何も作成されません。私はこれが私の専門家の承認のためかもしれないと思っていますか? – BB500

+0

私はpundit gemから私のapplication_policyとプロジェクトポリシーを追加しました...何が原因で問題が発生している可能性がありますか? thx – BB500

+0

@ BB500そのためには、「よくある質問」に関する別の質問をすることができます。 –

関連する問題