Вот что мне нужно сделать. У меня есть модель Tournament
, которая подключена к User
через Signup
(N: N).
Единственное, что добавляет 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
Я пропустил некоторый код, чтобы сохранить это коротким. Проблема с представлением, так как у меня есть много условий, чтобы иметь в виду. Вот мой реальный код ( с использованием Slim в качестве движка шаблонов )
- 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 минут, а пользователь уже зарегистрировался
И это только верхушка айсберга, потому что администраторы должны видеть больше информации, чем обычный пользователь, но я не хочу усложнять этот вопрос.
Основная проблема в том, как мне обращаться с такими случаями? Просто кажется таким ужасным делать это в представлении, но я не вижу другого более простого способа.