【发布时间】:2011-11-23 19:39:21
【问题描述】:
这是我需要做的。我有一个Tournament 模型,它通过Signup (N:N) 连接到User。
Signup 添加的唯一内容是注册状态。锦标赛有开始时间,用户只能在锦标赛开始前 60 分钟前注册。之后,注册用户就可以签入了。所以基本上我有两个状态选项
简而言之,模型看起来像这样
class Signup < ActiveRecord::Base
REGISTERED = 0
CHECKED = 1
belongs_to :tournament
belongs_to :user
end
class Tournament < ActiveRecord::Base
has_many :signups
has_many :users, :through => :signups
end
class User < ActiveRecord::Base
has_many :signups
has_many :tournaments, :through => :signups
end
为了简短起见,我跳过了一些代码。问题出在视图上,因为我要记住很多条件。这是我的实际代码 (using Slim as a templating engine)
- if logged_in?
- if current_user.registered_for?(@tournament)
- if @tournament.starts_at < 60.minutes.from_now
p Signups are closed, only registered users can now check in
- if current_user.registered_for?(@tournament)
= button_to "Checkin!", { :controller => :signups, :action => :update, :id => @tournament.id }, :method => :put
- else
= button_to "Cancel your registration for the tournament", { :controller => :signups, :action => :destroy, :id => @tournament.id }, :method => :delete
- elsif current_user.checked_in?(@tournament)
p You have already checked in.
- elsif @tournament.starts_at > 60.minutes.from_now
= button_to "Sign up for the tournament", :controller => :signups, :action => :create, :method => :post, :id => @tournament.id
- else
p
| The tournament starts in less than 60 minutes, you can't sign in
- else
p
| You need to
|
= link_to "log in", login_path
| to play
问题是,我不知道如何让这个更干净。我的意思是是的,我可以为按钮添加助手,但这对if if else else 丑陋无济于事,因为有很多不同的组合。这是一个简短的列表:
- 用户未登录
- 距离锦标赛开始还有 60 多岁,用户还没有注册锦标赛
- 距离锦标赛开始还有 60 多岁,并且用户已经注册
- 不到 60 分钟,但用户尚未注册
- 不到 60 分钟,用户已注册但尚未签入
- 不到 60 分钟,用户已经签到
这只是冰山一角,因为管理员应该比普通用户看到更多信息,但我不想让这个问题复杂化。
主要问题是,我应该如何处理这种情况?在视图中这样做似乎很糟糕,但我没有看到任何其他更简单的方法。
【问题讨论】:
-
@coreyward 是的,但这并没有真正帮助解决“太多如果”的事情,它只是把它移到另一个地方
-
我实际上并没有提交那条半句话的评论,无论如何都是故意的。哈!
标签: ruby-on-rails ruby coding-style view refactoring