创建新模型与在Rails中使用布尔条件

时间:2015-02-05 23:00:42

标签: ruby-on-rails rails-models conditional

我试图创建一个rails应用程序,它基本上是一个todo应用程序,允许用户在开始时选择两种模式之一。该模式将影响用户将看到的html输出,但基本的后端结构将是相同的(列表,任务,等)。例如,light_mode使用浅色方案,而暗色模式使用深色color_scheme。为Mode创建新模型或将Mode设置为布尔值(对于mode1为true,对于mode2为false)更好,并使用不同的视图,无论mode是true还是false。

1 个答案:

答案 0 :(得分:0)

第1步

而不是布尔属性。我会创建一个名为scheme的字符串属性。最初只有两个条目,明亮和黑暗,但这将允许您随着时间的推移更容易添加其他方案。我会将此直接添加到用户,而不是添加模型和关联。无论哪种方式都可能涉及向模型添加字段,也可以立即添加您正在使用的字段。这降低了复杂性,使您可以更有效地分配和检索属性,并且可以更轻松地进行测试。您的模型可能如下所示:

class User < ActiveRecord::Base

  validates :scheme,
            presence: true,
            inclusion: {
              in: proc { User.schemes },
              allow_blank: true }

  class << self

    def schemes
      [ 'light', 'dark' ]
    end

  end

end

然后,您甚至可以使用User.schemes填充用户表单中的下拉列表。


第2步

要渲染,我会考虑两种方法之一。我个人会做选项1。

选项1

如果结构通常是相同的,我只需将用户所需的方案作为类添加到body标签,并使用css完成所有样式。这是quite a bit more flexible than you might imagine

选项2

如果只是css不是一个选项,你可以通过牺牲DRYness来获得灵活性。为此,只需使用样式名称限定每个文件名,或者将其放在带有样式名称的目录中,并使用渲染电话。例如:

/app/views/users/index.html.erb
/app/views/users/dark_index.html.erb
/app/views/users/light_index.html.erb

/app/views/users/index.html.erb
/app/views/users/dark/_index.html.erb
/app/views/users/light/_index.html.erb

然后在/app/views/users/index.html.erb中,只有调用呈现特定部分的调用,如render "#{ current_user.theme }_index"或其他。

我会非常认真地尝试用css做这一切,如果可能的话,在进入所有这些之前,不过。