在Rails中自定义Devise视图


77

我正在使用devise进行用户身份验证,但是我在注册,登录等页面上有不错的模型。我已经完成了rails generate devise:views User命令,并将所有视图都包含在views文件夹中,但是,当我用自己的new.html.erb替换registration / new.html.erb时,没有任何变化或看起来都没有变化。好像我做了什么。

任何人都知道我在做什么错,或者至少知道如何成功自定义设计视图

PS是否需要注意将我的devise / registration#new更改为/ signup的路径很重要?


您是否尝试清空缓存?重装?重新启动服务器?
加尔


1
我知道了...最终我没有用户
Vasseurth

@Vasseurth:澄清一下,您的意思是不要在rails generate命令的末尾放置“ User”,因为它会生成作用域视图,这不是您想要的。
科林

Answers:


33

您的路线signupdevise/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,我该如何区分用户和管理员?
Vasseurth'7

3
rails generate devise:views用户已经为您生成/ users / registrations了吗?如果您还具有管理员角色,则还需要生成管理员视图(rails generate devise:views admin)。
凯文·蔡

121

一目了然的答案。

...代替

rails generate devise:views User

采用:

rails generate devise:views

如果已经完成了此操作,请将创建的文件夹devise从移动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

无需其他更改。


3
就是答案。默认情况下,您无法编辑devise视图,因为它们位于gem中,直到您像这样生成它为止。谢谢。
卢卡斯2015年

如果我越过您的IRL,我将为您买杯咖啡。
2015年

3
如果要自定义特定控制器的视图,请添加以下-v选项:rails generate devise:views -v registrations confirmations
Chambeur 2015年

6
如果您只有一种认证模型,这就是答案。如果您有2个用于身份验证的模型,请说usersadmins,则必须使用@QBDSolutions提供的以下答案
Ramakrishnan

109

尽管这是一个古老的问题,但我想我会补充一下,以防有人偶然发现。我不确定这是否是新添加的内容,因为最初是问这个问题的,但是如果这样,那么这是一种更简单(更现代)的方法。

文件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,devise将自动检查自定义视图是否存在,如果存在,则将其提供。就像它说的那样,确实增加了应用程序的开销,但是以我的经验,到目前为止,这是最小的。


3
谢谢!我一直想弄清楚如何激活我的“自定义”视图,直到遇到您的答案。
Xander

4
应该将其标记为解决方案,因为它可以正确解决原始问题。
michaeldwp

4
事实上,这个选项设置为true并没有增加开销,如果你实际上是在定义自定义视图。我认为您可能误解了文件中注释的含义。实际上,实际上要指出的是,没有理由打开自定义视图。因此,如果您打开它们并没有实际定义新视图,它将看它们是否存在,然后回退到默认视图,这将导致开销。因此,只要您定义自定义视图,理论上将此选项设置为true就不会增加任何开销。
mkralla11

1
这是正确的答案,红宝石的概念是去干。
vidur punj

1
大。回答!我有一个名为“事件”的模型,并且很久以来,为什么Rails不会路由到我的事件控制器而是设计/事件,这让我很困惑。好像你所描述的选项,请Rails的检查,如果我之前打算制定/事件首先有一个活动路径
ChairmanMeow

25

对于仍然对此有疑问的任何人,问题都在于致电rails generate devise:views User。它应该rails generate devise:views用于从Devise Rails Engine中获取当前视图。这将生成适用于默认路由的正确视图。


我该怎么回去?我运行rails generate devise:views UserUsers在视图中生成了一个文件夹,并且还生成了一个控制器文件夹users。当我将名称更改为devise它不起作用吗?
史蒂文·阿吉拉尔

20

生成自定义视图后,例如

rails generate devise:views User

开启scoped_viewsconfig/initializer/devise.rb

view config.scoped_views = true

您完成了。


12

使用rails g devise:views User,您可以在拥有多个角色时进行自定义。

正确的方法是进入您的devise.rbinconfig/initializer/文件夹

和评论和设置config.scoped_views = true

现在,您可以编辑view erb文件了,没有任何问题


1
这应该是答案
Ayman Salah

12

我遇到了同样的问题,直到我回头阅读了devise文档:)

之后,请rails generate devise:views确保您进入initializers/devise.rb并设置config.scoped_views = true。在https://github.com/plataformatec/devise的devise文档以及devise.rb注释中对此进行了解释。

完成此操作后,我的视图views/users开始显示,而不是gem中的视图。


2

为了将来参考,您可以从devise => user重命名文件夹,反之亦然,rails会找到一条路线。


1
我相信,这等同于这样做,rails g devise:views User只是它在设计文件夹旁边添加了新文件夹。至于允许铁轨找到路线,我认为这不是一个很好的习惯
-DazBaldwin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.