我不确定在以下场景中我的逻辑是否正确,也许它甚至不是最佳实践,或者可能有更简单的方法。我也不确定如何设置我的代码,所以如果有人有任何指针,这将是非常感激。
我有两个模型
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
创建迷你联赛时生成一个随机数(key),因此只有拥有该key的球队才能加入该联赛。密钥将传递给想要加入该特定迷你联赛的用户。
我有点卡住的部分是在向联赛添加球队时该怎么做,到目前为止,我的想法是在创建球队时有一个字段来添加这个键,然后保存到模型中(或者如果球队已经创建了更新键)。现在我的团队模型有了团队名和密钥。
对于如何比较这两个钥匙,以便只有授权的球队才能加入迷你联赛有什么建议吗?或者你会用不同的方式处理这个问题?我意识到这可能是一个很大的答案,但我很高兴采取一些指针,这样我就可以找到如何做这样的事情的资源
感谢编辑我能在团队控制器
中做这样的事情吗?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
我认为最好的方法是创建一个新的模型来表示Team和MiniLeague之间的联系。
实际上,需要验证的是该连接。另外,我想至少理论上一支球队可以被抛弃或被踢出迷你联赛;在这种情况下,你破坏的是两个模型之间的连接。
假设您可以在新模型中使用自定义验证器检查键。
如果我们把新模型命名为Enrollment:
在app/模型/team.rb:class Team < ActiveRecord::Base
attr_accessible :team_name, :user_id, :key
belongs_to :user
has_many :mini_leagues, through: enrollments
end
在app/模型/mini_league.rb: class MiniLeague < ActiveRecord::Base
attr_accessible :league_name, :league_key
has_many :teams, through: enrollments
end
在app/模型/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/enrollment ments_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
现在,如果您想要显示我们在自定义验证器中创建的自定义错误消息,简单的方法是创建一个部分,将其插入到新的Team表单中:
在你的app/views/enrollment/_form.html.erb:
<%= 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 %>
目标。errors包含错误数组,包括我们自定义的验证器,并且通过full_messages集合的迭代将显示"无效密钥"消息。
总结
创建新注册后,关联的Team和MiniLeague将响应:
my_team.mini_leagues
和
my_mini_league.teams