听起来您正在尝试推出自己的身份验证。
我建议使用Devise...great tutorial here:
原因有两个。
首先,Devise 让您能够在经过身份验证的用户和未经过身份验证的用户之间分割您的应用。也就是说,它提供了user_signed_in?、devise_controller? 和current_user 帮助器来帮助解决这个问题。
这可能看起来没什么大不了,但它实际上会帮助您进行布局(我稍后会详细介绍)。
其次,Devise 是预滚动的。您关于如何处理signups 和registrations 的问题已经得到解决。当然,没有什么可以阻止您进行自己的身份验证(Devise 毕竟只是建立在Warden 之上),但它应该会给您一些关于如何做到这一点的想法。
关于您的原始问题(关于布局),另一个答案非常好(就每个方法设置 layouts 等而言)。
补充一点,我想说你必须记住 Rails 是一系列的类。因此,在controller 中设置layout 选项是确保您获得正确选项的最佳方式。
这里是Rails explanation on it:
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
layout :your_layout
private
def your_layout
devise_controller? || !user_signed_in? ? "new_user" : "application"
end
end
我发现最好让你的逻辑尽可能简洁。 IE 只有一套布局逻辑。我们倾向于将其保留在 ApplicationController 中,并在必要时覆盖。
--
最后,您的问题还凸显了对 Rails 的基本误解。我不是不尊重;我发现你对框架的理解越清晰,你就越能更好地使用它:
你必须记住 Rails 的几个关键点:
- 这是一个 MVC(Model View Controller)框架
- 它基于 Ruby 构建;因此是面向对象的
也许我应该将“new”和“create”放在注册控制器中。这让我感到困惑。
如果您将Devise 作为模型,您会发现您可以将控制器视为对象 的抽象层。也就是说,正如 Devise 向我们展示的那样,您可以拥有 sessions 和 registrations 控制器。
我并不是在提倡你完全这样做,我我试图表明,如果你把焦点放在你正在使用的对象上,它会变得更清晰你的控制器动作应该放在哪里。
您还将最好地了解 CRUD(Create R阅读 U更新 Destroy) Rails 控制器和对象的性质。标准的 Rails 控制器是这样设置的:
虽然这并不严格,但它确实为您提供了另一个关于您的控制器应遵循的结构的指示。
你可能已经知道这些东西了!