在 Rails 中自定义设计视图
Posted
技术标签:
【中文标题】在 Rails 中自定义设计视图【英文标题】:Customizing Devise views in Rails 【发布时间】:2011-10-02 13:48:37 【问题描述】:我正在为用户身份验证使用设计,但我为注册、登录等页面提供了不错的模型。
我已经完成了rails generate devise:views User
命令并在views 文件夹中拥有了所有视图,但是,当我用我自己的new.html.erb 替换registration/new.html.erb 时,没有任何变化,看起来也没有什么不同。好像我做了什么。
任何人都知道我做错了什么,或者至少知道如何成功自定义设计视图
附:重要的是要注意我将 devise/registration#new 的路由更改为 /signup 吗?
【问题讨论】:
您是否尝试清空缓存?重新加载?重启服务器? github.com/plataformatec/devise/issues/115 我想通了...我最后不能有用户 @Vasseurth:澄清一下,您的意思是不要将“用户”放在 rails generate 命令的末尾,因为它会生成一个范围视图,这不是您想要的。 【参考方案1】:在我回去阅读设计文档之前,我遇到了同样的问题 :)
在rails generate devise:views
之后确保进入initializers/devise.rb
并设置config.scoped_views = true
。这在https://github.com/plataformatec/devise 以及devise.rb
cmets 的设计文档中进行了解释。
完成此操作后,我在 views/users
中的视图开始显示,而不是 gem 中的视图。
【讨论】:
【参考方案2】:对于任何对此仍有疑问的人,问题在于对rails generate devise:views User
的调用。它应该是rails generate devise:views
,用于从 Devise Rails 引擎获取当前视图。这将生成适用于默认路由的正确视图。
【讨论】:
如何返回?我运行了rails generate devise:views User
,它在视图中生成了一个文件夹Users
,还生成了一个控制器文件夹users
。当我将名称更改为devise
时,它不起作用?【参考方案3】:
您的路线signup
或devise/registrations#new
将呈现视图
views/devise/registrations/new.html.erb
。听起来你做了
更改为views/user/registrations/new.html.erb
,这将解释
为什么你没有看到它没有被渲染后所做的更改。
您需要创建一个user/registrations_controller.rb
从Devise::RegistrationsController
延伸并指向您的/signup
路由到user/registrations#new
,或者您可以进行更改
直接到views/devise/registrations/new.html.erb
同样的想法适用于您的登录 (devise/sessions
) 页面。
希望这会有所帮助。
【讨论】:
如果没有 /users/registration 或 /admin/registrations,我将如何区分用户和管理员? rails generate devise:views 用户已经为您生成了 /users/registrations 是否正确?如果您也有管理员角色,那么您还需要生成管理员视图(rails generate devise:views admin)。【参考方案4】:生成自定义视图后,例如
rails generate devise:views User
在config/initializer/devise.rb
中开启scoped_views
view config.scoped_views = true
你就完成了。
【讨论】:
【参考方案5】:虽然这是一个老问题,但我想我会添加它以防有人偶然发现它。我不确定这是否是新添加的,因为最初提出了这个问题,但如果是这样,更简单(更现代)的方法就是这样。
在文件config/initializers/devise.rb
中有如下代码块:
# ==> Scopes configuration
# Turn scoped views on. Before rendering "sessions/new", it will first check for
# "users/sessions/new". It's turned off by default because it's slower if you
# are using only default views.
# config.scoped_views = false
通过取消注释 config.scoped_views = false
并将其值更改为 true
,设计将自动检查自定义视图是否存在,如果存在,则提供该视图。正如它所说,它确实给应用程序增加了一些开销,但以我目前的经验来看,这是最小的。
【讨论】:
谢谢!在遇到您的答案之前,我一直在尝试弄清楚如何激活我的“自定义”视图。 这应该被标记为解决方案,因为它正确地解决了原始问题。 实际上,将此选项设置为 true not 会增加开销 if 您实际上是在定义自定义视图。我认为您可能误解了文件中注释的含义。它实际上指出的是,默认情况下,没有理由打开自定义视图。因此,如果您打开它们并且没有实际定义新视图,它会查看它们是否存在,然后它将回退到默认值,这将导致开销。因此,只要您定义了自定义视图,理论上将此选项设置为 true 应该不会增加任何开销。 这是正确的答案 ruby 概念是去 DRY。 太棒了。回答!我有一个名为“Events”的模型,很长一段时间以来我都为为什么 Rails 不会路由到我的事件控制器而是设计/事件而感到困惑。看起来像你描述的选项,让 Rails 在去设计/事件之前先检查我是否有事件路径【参考方案6】:使用rails g devise:views User
允许您自定义何时拥有多个角色。
正确的方法是进入devise.rb
文件夹中的config/initializer/
取消注释并设置config.scoped_views = true
。
现在您可以毫无问题地编辑查看 erb 文件
【讨论】:
这应该是答案【参考方案7】:为了将来参考,您可以从 devise => 用户重命名文件夹,反之亦然,rails 会找到一条路线。
【讨论】:
我相信这相当于做rails g devise:views User
,只是它在设计文件夹旁边添加了新文件夹。至于让rails找到路线,我觉得这不是一个很好的习惯【参考方案8】:
一目了然的答案。
...而不是
rails generate devise:views User
使用:
rails generate devise:views
如果您已经这样做了,请将创建自 app/views/User
的文件夹移动到新文件夹 app/views/devise
(或将 User
文件夹重命名为 devise
,如果这是一个选项。)
这些文件夹是:
app/views/User/confirmations
app/views/User/mailer
app/views/User/passwords
app/views/User/registrations
app/views/User/sessions
app/views/User/shared
app/views/User/unlocks
无需进行其他更改。
【讨论】:
这就是答案。默认情况下,您无法编辑设计视图,因为它们在其中 gem 中,直到您像这样生成它。谢谢。 如果我遇到你的 IRL,我会请你喝杯咖啡。 如果您想从特定控制器自定义视图,请添加-v
选项,如下所示:rails generate devise:views -v registrations confirmations
如果您只有一个用于身份验证的模型,这就是答案。如果您有 2 个用于身份验证的模型,例如 users
和 admins
,您将不得不使用 @QBDSolutions 提供的以下答案以上是关于在 Rails 中自定义设计视图的主要内容,如果未能解决你的问题,请参考以下文章