2015-12-15 128 views
0

在進行關聯驗證時是否可以更改is invalid錯誤?自定義關聯錯誤消息

我的代碼:

class Membership < ActiveRecord::Base 
    belongs_to :user, inverse_of: :memberships 
    belongs_to :team, inverse_of: :memberships 

    validate :user_cannot_have_same_team_name 

    protected 

    def user_cannot_have_same_team_name 
    if User.find(user.id).teams.map(&:name).include? team.name 
     errors.add :base, "Duplicate team name" 
    end 
    end 
end 


class User < ActiveRecord::Base 
    has_many :teams, through: :memberships 
    has_many :memberships, dependent: :destroy 
    # ... 
end 

class Team < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, through: :memberships 
    has_many :thanks 

    validates :name, presence: true 

    validate do |team| 
    team.memberships.each do |membership| 
     membership.errors.full_messages.each do |message| 
     errors[:base] << message 
     end 
    end 
    end 
end 

使用Rails控制檯:

[1] pry(main)> team = User.first.teams.new(name: "Wat") 
    User Load (0.2ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1 
=> #<Team:0x007fc38b72dfe8 id: nil, name: "Wat", created_at: nil, updated_at: nil> 
[2] pry(main)> team.save 
    (0.2ms) BEGIN 
    User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 
    Team Load (0.3ms) SELECT `teams`.* FROM `teams` INNER JOIN `memberships` ON `teams`.`id` = `memberships`.`team_id` WHERE `memberships`.`user_id` = 1 
    (0.2ms) ROLLBACK 
=> false 
[3] pry(main)> team.errors 
=> #<ActiveModel::Errors:0x007fc38b604c48 
@base=#<Team:0x007fc38b72dfe8 id: nil, name: "Wat", created_at: nil, updated_at: nil>, 
@messages={:memberships=>["is invalid"], :base=>["Duplicate team name"]}> 

正如你所看到的,總會有即使我已經把我的自定義mesage is invalid錯誤。請指教。先謝謝你。

回答

0

你會更好使用內部的ActiveRecord的內置validations

class Membership < ActiveRecord::Base 
    belongs_to :user, inverse_of: :memberships 
    belongs_to :team, inverse_of: :memberships 

    validate :user, uniqueness : { scope: :team, message: "Duplicate Team" } 
end 

對於這個錯誤,你對驗證team.name。爲什麼這樣做,當你可以處理Teamid的 - 實際的對象。球隊的name應歸因於團隊對象,所以你不希望用戶擁有多個團隊對象(因此使用了:uniqueness驗證)

-

爲了您Team模型,您可以通過實際使用模型拉動相關驗證inverse_of -

class Team < ActiveRecord::Base 
    has_many :memberships, inverse_of: :team 
end 

應該包括任何新所有的驗證你想通過你的Team創建:

#app/views/teams/new.html.erb 
<%= form_for @team do |f| %> 
    <%= f.errors... #-> this should have all the errors from membership %> 
<% end %> 
+0

糾正我,如果我錯了,但您的驗證仍然允許用戶創建一個團隊使用相同的名稱?例如,用戶A應該能夠創建一個名稱設置爲Team1的團隊。之後,他不能再創建一個名字爲Team1的團隊。我試過在'rails console'中使用相同的命令,這次它只是通過了 – RubyCat