2013-05-07 36 views
0

我不確定在以下情況下我的邏輯是否正確,可能它甚至不是最佳實踐,或者可能有更簡單的方法。另外我不確定如何設置我的代碼,所以如果任何人有任何指針,將不勝感激。使用密鑰授權創建模型屬性

好了,所以我有兩個型號

class MiniLeague < ActiveRecord::Base 
    attr_accessible :league_name, :team_id, :league_key 

    has_many :teams 
end 


class Team < ActiveRecord::Base 
    attr_accessible :team_name, :user_id, :mini_league_id, :key 

    belongs_to :user 
    has_many :mini_leagues 
end 

當創建生成隨機數的迷你聯賽(密鑰),只有擁有該密鑰團隊可以加入該聯盟。關鍵將傳遞給想要加入該特定迷你聯賽的用戶。

我有點困擾的部分是在向聯盟添加球隊時該怎麼做,到目前爲止,我的想法是在創建球隊時有一個字段添加此鍵,然後將其保存到模型中(或者if該團隊已經使用密鑰創建了更新)。所以現在我的團隊模型有團隊名稱和密鑰。

任何有關如何比較兩個鍵的建議,以便只有經過授權的團隊才能加入迷你聯盟。或者你會以不同的方式處理?我意識到這可能是一個大的答案,但我樂於接受一些指針,這樣我就可以去找到如何做這樣的事情

感謝

編輯資源

我能做一些像這樣的球隊控制器

Team Controller 

def create 
    if params[:key] && params[:mini_league_id] == params[:mini_league][:league_key] && params[:mini_league][:league_id] 
    @team = Team.create(params[:team]) 
    else 
    render :new, notice: "invalid key" 
    end 
end 

end 

回答

1

我認爲最好的方法是創建一個新的模型來表示團隊和MiniLeague之間的連接。

實際上,需要驗證的是該連接。另外,我猜想至少在理論上一支球隊可能會被淘汰出局,在這種情況下,你所摧毀的是兩種模型之間的聯繫。

假設您可以使用新模型中的自定義驗證器來檢查密鑰。

所以,如果我們所說的新模式,讓我們說報名:

在應用程序/模型/ team.rb:

class Team < ActiveRecord::Base 
    attr_accessible :team_name, :user_id, :key 

    belongs_to :user 
    has_many :mini_leagues, through: enrollments 
end 

在應用程序/模型/ mini_league.rb:

​​

在app/models/enrollment.rb中:

class Enrollment < ActiveRecord::Base 
    attr_accessible :team_id, :mini_league_id 

    belongs_to :team 
    belongs_to :mini_league 

    validate :valid_key? 

    protected 
    def valid_key? 
     errors.add(:base, "Invalid key") unless team.key == mini_league.league_key 
    end 
end 

現在,註冊控制者將負責創建團隊和迷你聯盟之間的連接,而不是團隊控制者。

因此,您的控制器只是負責觸發'save'方法,根據模型邏輯它將是有效或無效的,因爲它應該是(app/controllers/enrollments_controller。RB):

class EnrollmentsController < ApplicationController 
    ... 
    def create 
    @enrollemnt = Enrollment.new(params[:enrollment]) 

    if @enrollment.save 
     # success, go on with the application flow 
    else 
     # error, automanaged for custom model validator if comes from a non valid league key, show the form again 
     render :new 
    end 
    end 
end 

現在,如果你想顯示我們在自定義驗證簡單的方法是創建一個部分在新團隊的形式插入已創建的自定義錯誤消息:

在您的應用程序/視圖/入學/ _form.html.erb:

<%= form_for(@enrollment) do |f| %> 
    <%= render "shared/error_messages", :target => @enrollment %> 

    # and then the rest of your form 
    ... 

,並在應用程序/視圖/共享/ error_messages:

<% if target.errors.any? %> 
<div id="errorExplanation"> 
    <h2><%= pluralize(target.errors.count, "error") %> prohibited this record from being saved:</h2> 
    <ul> 
    <% target.errors.full_messages.each do |msg| %> 
    <li><%= msg %></li> 
    <% end %> 
    </ul> 
</div> 
<% end %> 

target.errors包含錯誤數組,包括我們的自定義驗證器,並且通過full_messages集合的迭代將顯示「無效密鑰」消息。

綜上所述

創建一個新的擴招後,無論是相關團隊和MiniLeague會迴應:

my_team.mini_leagues 

,並

my_mini_league.teams 
+0

喜@Galen,感謝那確實有幫助,快速的問題,在我的其他聲明中,我只是打電話給valid_key?方法,因爲目前我得到您需要提供至少一個驗證錯誤消息母雞渲染頁面 – Richlewis 2013-05-07 19:47:26

+0

好所以現在錯誤是未定義方法mini_league在模型 – Richlewis 2013-05-07 20:18:09

+0

我改變驗證 – Richlewis 2013-05-07 20:24:45