Ruby on rails 在2个布局中使用1个控制器

Ruby on rails 在2个布局中使用1个控制器,ruby-on-rails,logic,social-networking,Ruby On Rails,Logic,Social Networking,我有一个逻辑问题,我不知道怎么做。首先,我正在一个社交网站上工作,我用纯PHP完成了这个网站,但现在我正在用rails重新编写后端 我的问题是,我生成了UsersController,它有新建、创建、显示、编辑、更新、删除和销毁 我想我可以用“新建”来显示注册页面,“创建”来处理注册,“显示”来显示个人资料页面,“编辑”来显示帐户设置,“更新”来处理编辑 我可能在这里有一个逻辑问题,也许我应该把“新建”和“创建”放在注册控制器中。这让我感到困惑。我说的第一个逻辑的问题是,我有两个布局,一个用于登

我有一个逻辑问题,我不知道怎么做。首先,我正在一个社交网站上工作,我用纯PHP完成了这个网站,但现在我正在用rails重新编写后端

我的问题是,我生成了UsersController,它有新建、创建、显示、编辑、更新、删除和销毁

我想我可以用“新建”来显示注册页面,“创建”来处理注册,“显示”来显示个人资料页面,“编辑”来显示帐户设置,“更新”来处理编辑

我可能在这里有一个逻辑问题,也许我应该把“新建”和“创建”放在注册控制器中。这让我感到困惑。我说的第一个逻辑的问题是,我有两个布局,一个用于登录前,另一个用于登录后。(你可以想象Facebook在登录前和登录后的标题)

所以,当我有2个不同的布局时,我不能在2个布局中使用1个控制器。因为注册页面有“登录前标题设计”,帐户设置和配置文件有“登录后标题设计”。你们可以猜到,我在控制器中定义了布局


我不知道我是否解释得很好。谢谢。

Rails具有基本的CRUD默认操作。此外,根据HTTP谓词,每个操作可以有不同的处理。您还可以添加自定义操作和路由

对于每个默认操作,最好遵循标准Rails实践。例如,当通过GET访问时,“新建”操作应路由到表单以创建新用户。表单的HTTP POST应该路由到“创建”操作

如果需要添加其他控制器操作,请使用自定义方法。我再次强调,简单的CRUD操作应该遵循正常的Rails惯例

阅读更多关于

请多次阅读本指南以了解

默认情况下,Rails将查找与控制器同名的布局,或application.html.erb。但您也可以指定一个控制器范围(这对您没有帮助,但请耐心等待)

这仍然是广泛的布局,所以不是你需要的

但您也可以在操作中每次调用
render
时指定特定的布局:

def edit
   #some logic
   render "some_template", :layout => "some_layout"
end
或者,采用默认模板查找,但仍指定布局:

def edit
   # some logic
   render :layout => "some_layout"
end
还有另一种方法可以指定布局,这可能特别适用于“一个布局如果未登录,另一个布局如果登录”的用例:

您可以了解有关在中指定布局的不同方法的更多信息


希望这有帮助

我决定使用单独的控制器,而不是在两个布局中使用一个控制器。所以,我有profile_控制器,它有“编辑”和“更新”用于帐户设置,还有“显示”用于显示profile。我还使用了用户控制器,它有以下功能:登录、登录尝试、注册、注册尝试等


所以,我不是将注册和编辑放在一个控制器中,而是使用两个不同的控制器更好、更干净。我想。

听起来像是你在尝试使用自己的身份验证

我建议使用…:

原因有两个

首先,Desive让您能够将您的应用程序分为经过身份验证的用户和未经身份验证的用户。也就是说,它提供了支持,并提供了帮助

这看起来可能没什么大不了的,但它实际上会帮助您进行布局(稍后我会详细介绍)

其次,设计是预轧制的。您关于如何处理
注册
注册
的问题已经解决。当然,没有什么可以阻止您进行自己的身份验证(Desive毕竟只是建立在
Warden
的基础上),但它应该可以让您了解如何进行身份验证


关于您最初的问题(关于布局),另一个答案非常好(关于每个方法的设置
layouts
等)

另外,我要说的是,您必须记住Rails是一系列类。因此,在
控制器
中设置
布局
选项是确保获得正确布局的最佳方法

这是:

#app/controllers/application_controller.rb
类ApplicationController
我发现你的逻辑最好尽量简洁。IE只有一套布局逻辑。我们倾向于将其保存在
应用程序控制器中,必要时进行重写

--

最后,您的问题还突出了对Rails的一个基本误解。我不是无礼;我发现,您对框架的理解越清晰,就越能更好地使用它:

您必须记住Rails的几个关键点:

  • 它是一个MVC(ModelViewCcontroller)框架
  • 它是建立在Ruby之上的;因此是面向对象的
  • 也许我应该把“新建”和“创建”放在注册控制器中。这让我感到困惑

    如果将
    design
    作为一个模型,您将看到可以将控制器视为对象的抽象层。也就是说,正如Deviate向我们展示的那样,您可以拥有
    会话
    注册
    控制器

    我并不是要你这么做,我只是想表明,如果你把焦点放在你正在处理的对象上,你的控制器动作应该放在哪里就会变得更清晰

    您还可以最好地理解Rails控制器和对象的CRUD(CreateReadUpdateDestroy)性质。标准Rails控制器的设置如下:

    虽然这并不严格,但它确实为您提供了控制器应遵循的结构的另一个指示。
    def edit
       # some logic
       render :layout => "some_layout"
    end
    
    class SomeController
       layout :method_name_to_determine_layout
    
       # ... actions ...
    
       protected
       def method_name_to_determine_layout
         if current_user
            "logged_in_layout_name"
         else
            "not_logged_in_layout_name"
         end
       end
    
    #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