我不确定在以下场景中我的逻辑是否正确,可能它甚至不是最佳实践,也可能是更简单的方法。此外,我不确定如何设置我的代码,所以如果有人有任何指针,将不胜感激。
好的,我有两个型号
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
在创建迷你联赛时,会生成一个随机数(关键),这样只有拥有该关键字的球队才能加入该联盟。密钥将传递给想要加入特定迷你联盟的用户。
我有点坚持的部分是在将团队添加到联盟时要做什么,到目前为止我的想法是在创建团队时有一个字段来添加此密钥然后保存到模型中(或者如果团队已经使用密钥创建了更新)。所以现在我的团队模型有一个团队名称和一个密钥。
有关如何比较两个键的任何建议,以便只有授权的团队才能加入迷你联盟。或者你会采用不同的方法吗?我意识到这可能是一个很大的答案,但我很乐意采取一些指示,以便我可以找到有关如何做这样的事情的资源
由于
修改
我能否在团队控制器中做到这样的事情
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
答案 0 :(得分:1)
我认为最好的方法是创建一个新模型来表示Team和MiniLeague之间的联系。
事实上,需要验证的是连接。另外,我想至少在理论上一个团队可以放弃/从MiniLeague中退出;在这种情况下,你正在摧毁的是两个模型之间的联系。
假设采用这种方法,您可以在新模型中使用自定义验证器检查密钥。
所以,如果我们打电话给新模型,那就让我们说注册:
在app / models / team.rb中:
class Team < ActiveRecord::Base
attr_accessible :team_name, :user_id, :key
belongs_to :user
has_many :mini_leagues, through: enrollments
end
在app / models / mini_league.rb中:
class MiniLeague < ActiveRecord::Base
attr_accessible :league_name, :league_key
has_many :teams, through: enrollments
end
在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
现在,Enrollment控制器将负责在Team和MiniLeague之间创建连接,而不是Team控制器。
所以你的控制器只负责触发'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_for(@enrollment) do |f| %>
<%= render "shared/error_messages", :target => @enrollment %>
# and then the rest of your form
...
并在app / views / shared / 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集合的迭代将显示“无效密钥”消息。
总结
创建新的注册后,关联的Team和MiniLeague都将响应:
my_team.mini_leagues
和
my_mini_league.teams