在 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】:

您的路线signupdevise/registrations#new 将呈现视图 views/devise/registrations/new.html.erb。听起来你做了 更改为views/user/registrations/new.html.erb,这将解释 为什么你没有看到它没有被渲染后所做的更改。

您需要创建一个user/registrations_controller.rbDevise::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 个用于身份验证的模型,例如 usersadmins,您将不得不使用 @QBDSolutions 提供的以下答案

以上是关于在 Rails 中自定义设计视图的主要内容,如果未能解决你的问题,请参考以下文章

ruby Rails中自定义rake任务

android xml,布局中自定义视图的崩溃

如何在 Amazon S3 中自定义 Rails 5.2 ActiveStorage 附件的路径?

Rails管理员 - 在“导出”部分中自定义关联的差异值

如何在 iOS 中自定义权限请求视图

如何在 Qt 中自定义列表视图