我试图创建一个rails应用程序,它基本上是一个todo应用程序,允许用户在开始时选择两种模式之一。该模式将影响用户将看到的html输出,但基本的后端结构将是相同的(列表,任务,等)。例如,light_mode使用浅色方案,而暗色模式使用深色color_scheme。为Mode创建新模型或将Mode设置为布尔值(对于mode1为true,对于mode2为false)更好,并使用不同的视图,无论mode是true还是false。
答案 0 :(得分:0)
而不是布尔属性。我会创建一个名为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
填充用户表单中的下拉列表。
要渲染,我会考虑两种方法之一。我个人会做选项1。
如果结构通常是相同的,我只需将用户所需的方案作为类添加到body标签,并使用css完成所有样式。这是quite a bit more flexible than you might imagine。
如果只是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做这一切,如果可能的话,在进入所有这些之前,不过。