ruby-on-rails - 在 Rails 中重构 View 逻辑

标签 ruby-on-rails ruby coding-style view refactoring

这是我需要做的。我有一个 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

为了简短起见,我跳过了一些代码。问题出在 View 上,因为我要记住很多条件。这是我的实际代码 ( 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 丑陋问题没有帮助,因为有许多不同的组合。这是一个简短的列表:

  • 用户未登录
  • 比赛开始前超过 60 且用户尚未注册比赛
  • 比赛开始前超过 60 岁,用户已经注册
  • 不到 60 分钟,但用户尚未注册
  • 不到 60 分钟,用户已注册但尚未签到
  • 不到 60 分钟,用户已经签到

这只是冰山一角,因为管理员应该比普通用户看到更多信息,但我不想让这个问题复杂化。

主要问题是,我该如何处理这种情况?在 View 中执行此操作似乎很糟糕,但我看不到任何其他更简单的方法。

最佳答案

更简洁的方法是在您的模型上创建有意义的方法。例如,在您的 Tournament 模型中,添加如下内容:

def can_register?( user )
  !user.registered_for?(self) && self.starts_at > 60.minutes.from_now
end

然后在您的 View 中,您可以在显示某些内容之前检查 can_register?。像您那样将逻辑添加到 View 中并不是 MVC 应用程序的目的。

关于ruby-on-rails - 在 Rails 中重构 View 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8248088/

相关文章:

Ruby 字符串整数扫描

c++ - Objective-C++的缺点?

java - 在一行中初始化来自同一源的多个变量(JAVA)

sql - "Flexible"(?) Rails 数据库

ruby-on-rails - 如何使用form_for将参数传递给 Controller ​​ruby on rails

javascript - 我的样式表没有加载,但路径是正确的

javascript - 在coffeescript中模拟链接点击

ruby - 如何动态使用优化

html - 注入(inject) Ruby 并放入 HTML

c++ - 样式和命名空间