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