2016-03-20 15 views
0

私はユーザーモデル、グループモデル(Cliq)、およびグループメンバーモデル(Cliq_Membership)を持っています。これまでのところすべてがうまくいっているようです。私は現在、ユーザーがグループを作成して「所有」し、「所有者」がグループを離れると(グループメンバーシップを破棄する)、グループ全体が破棄されるようにしています。グループには1人のオーナーと多数のメンバーがいます。私は、ユーザーが「メンバー」であることを要求しなければならないようにしたいと思います。私は "所有者"が要求を見て、要求を受け入れる/拒否する唯一のものにしたい。明確にするためユーザーにグループメンバーシップを要求する方法を教えてください。

  • 私はCliqsは所有者だけが見ることができるはずメンバー
  • であることをユーザーに要求することができるようにしたいユーザーは、グループメンバー
  • ことを要求する必要がありますする必要友人の要求を受け入れる/拒否する
  • 私は、関係が "双方向/自己参照"であることを望みます。つまり、私は

がどのようにこれを実現するかグループ=ユーザー/メンバーは、グループや他のメンバー

  • Cliqsを持つようにグループに含まれているものとして示されたいですか?ここで

    は、これまでの私のコードです:

    モデル:

    class User < ActiveRecord::Base 
    has_many :uploads 
    has_one :owned_cliq, foreign_key: 'owner_id', class_name: 'Cliq', dependent: :destroy 
    
    has_many :cliq_memberships 
    has_many :cliqs, through: :cliq_memberships 
    end 
    
    class CliqMembership < ActiveRecord::Base 
    belongs_to :cliq 
    belongs_to :user 
    end 
    
    class Cliq < ActiveRecord::Base 
    belongs_to :owner, class_name: 'User' 
    
    has_many :cliq_memberships, dependent: :destroy 
    has_many :members, through: :cliq_memberships, source: :user 
    
    end 
    

    コントローラ:

    class CliqMembershipsController < ApplicationController 
    
    def create 
        #Cliq or Cliq_ID? 
        @cliq = Cliq.find(params[:cliq]) 
    
        @cliq_membership = current_user.cliq_memberships.build(cliq: @cliq) 
        @cliq.members << current_user 
    
        if @cliq_membership.save 
         flash[:notice] = "Joined #{@cliq.name}" 
        else 
         flash[:notice] = "Not able to join Cliq." 
        end 
        redirect_to cliq_url 
    end 
    
    def destroy 
        @cliq_membership = current_user.cliq_memberships.find(params[:id]) 
        @cliq = @cliq_membership.cliq 
    
        if @cliq.owner == current_user 
         @cliq.destroy 
         flash[:notice] = "Cliq has been deleted." 
         redirect_to current_user 
        else 
        @cliq_membership.destroy 
         flash[:notice] = "You left the Cliq." 
        redirect_to current_user 
        end 
    end 
    end 
    
    class CliqsController < ApplicationController 
    
    def show 
        @cliq = Cliq.find(params[:id]) 
    end 
    
    def new 
        @cliq = Cliq.new(params[:id]) 
    end 
    
    def create 
        @cliq = current_user.build_owned_cliq(cliq_params) 
        @cliq.members << current_user 
    
        if @cliq.save 
         redirect_to current_user 
        else 
         redirect_to new_cliq_path 
        end 
    end 
    
    def destroy 
        #@cliq = current_user.owned_cliq.find(params[:id]) 
        #lash[:alert] = "Are you sure you want to delete your Cliq? Your Cliq and all of its associations will be permanently deleted." 
        #@cliq.destroy 
    
        #if @cliq.destroy 
         #redirect_to current_user 
         #flash[:notice] = "You deleted the Cliq." 
        #else 
         #redirect_to current_user 
         #set up error handler 
         #flash[:notice] = "Failed to delete Cliq." 
        #end 
    end 
    
    
    def cliq_params 
        params.require(:cliq).permit(:name, :cliq_id) 
    end 
    end 
    
  • 答えて

    1

    あなたはrequest.rbを作成し、ユーザーの要求に

    を処理するための別のモデルとコントローラを作成することができますモデル

    class Request < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :cliq 
    end 
    

    作成requests_controller.rb

    class RequestsController < ApplicationController 
    
        before_action :set_group 
        before_action :auth_group_owner 
        before_action :find_request, except: [:index, :create] 
    
        def index 
        end 
    
        def create 
        @grp.requests.where(user_id: current_user.id).first_or_create 
        # redirect the user 
        end 
    
        def approv 
        # add the user to the group 
        @request.destroy 
        # redirect 
        end 
    
        def destroy 
        #delete the request 
        end 
    
        private 
    
        def set_group 
        #find group @grp 
        end 
    
        def auth_group_owner 
        if current_user != @grp.owner 
        redirect 
        end 
        end 
    
        def find_request 
        #find request 
        end 
    
    end 
    

    あなたroutes.rb

    resources :groups do 
        resources :requests, only: [:index, :destroy] do 
        member do 
         get 'approv' 
        end 
        end 
    end 
    
    +0

    リクエストを作成(送信)するにはどうすればよいですか? –

    +0

    これでうまくいくはずです。 –

    0

    次のソリューションは、要求のための新しいモデルを作成せずに動作するはずです。特定のcliq_memberhipが確認されているかどうかを格納するためにCliqMembershipモデルに新しいブール値フィールドを追加するだけで十分です。これにより

    class User < ActiveRecord::Base 
        has_many :cliq_memberships 
        has_many :cliqs, through: :cliq_memberships 
        has_many :confirmed_memberships, -> { confirmed }, class_name: "CliqMembership" 
        has_many :confirmed_cliqs, through: :confirmed_memberships, source: :cliq 
    end 
    
    class CliqMembership < ActiveRecord::Base 
        belongs_to :cliq 
        belongs_to :user 
    
        scope :confirmed, -> { where(confirmed: true) } 
    end 
    
    class Cliq < ActiveRecord::Base 
        has_many :cliq_memberships, dependent: :destroy 
        has_many :members, through: :cliq_memberships, source: :user 
        has_many :confirmed_memberships, { confirmed }, class_name: "CliqMembership" 
        has_many :confirmed_members, through: :confirmed_memberships, source: :user 
    end 
    

    (例えば、「確認」のは、そのフィールドを呼びましょう)新しいcliq_membershipがユーザによって作成されたとき、あなたはデフォルトでfalseconfirmedフィールドの値を設定することができます。限り、所有者updateのその特定のcliq_membershipはconfirmedの値をtrueに変更する。

    user & cliqは、それぞれUserモデル& CLIQモデルのインスタンスであると仮定すると、あなたは今user.confirmed_cliqscliq.confirmed_membersを使用することができます。

    編集:

    のみCLIQ所有者にcliq_membershipの編集&更新アクションを制限するために、あなたはフィルタ前を使用することができます。

    class CliqMembershipsController < ApplicationController 
        before_action :cliq_owner, only: [:edit, :update] 
    
        def edit 
        @cliq_membership = CliqMembership.find(params[:id]) 
        end 
    
        def update 
        @cliq_membership = CliqMembership.find(params[:id]) 
        @cliq_membership.update_attributes(cliq_membership_params) 
        end 
    
        private 
        def cliq_membership_params 
         params.require(:cliq_membership).permit(:cliq_id, :user_id, :confirmed) 
        end 
    
        def cliq_owner 
         @cliq = CliqMembership.find(params[:id]).cliq 
         redirect_to root_url unless @cliq.owner == current_user 
        end 
    end 
    

    ご希望の場合は、ご利用ください。

    +0

    これは本当に私が取得しようとしてきたものに近いようです。コントローラーの操作を変更するにはどうすればよいですか? Cliq/Cliq-Ownerからユーザーにリクエストを送信するにはどうすればよいですか? –

    +0

    'confirmed'フィールドをfalseからtrueに更新するには、' CliqMembershipsController'に 'edit'と' update'アクションが必要です。私はcliqの所有者に特権を制限する方法を含める答えを更新しました。 – Vishal

    +0

    意味があります。 Cliqは、ユーザーがCliqに応答して参加するために、どのようにユーザーに要求を送信しますか? –

    関連する問題