可以在另一个控制器中创建一个实例化对象吗?

时间:2016-05-06 23:59:19

标签: ruby-on-rails ruby object model-view-controller controller

我有一个客户控制器。在新操作中,我重定向到另一个页面,该页面属于页面控制器

class CustomersController < ApplicationController
  def new
    redirect_to register_path
  end 

是否可以像这样在注册操作中创建对象?

class PagesController < ApplicationController        
  def registration
    @customer = Customer.new
  end
end

1 个答案:

答案 0 :(得分:0)

我认为设置是这样的:您的应用程序中有一个客户模型,比如代理。您的网站用户注册为任何一个,并且希望拥有一个HTML页面(URL),同时提供这两个选项。他们选择他们是哪一个并提交一些字段,比如姓名/电子邮件/密码。为了简单起见,没有用JavaScript来隐藏选项卡背后的东西,你可以使用以下内容:

**Customer**
Name: ___________
Email: __________
Password: _______
[Submit]

**Agent**
Name: ___________
Email: __________
Password: _______
[Submit]

这里有一些选项可以避免Rails控制器中的内疚感:

  1. 重要的客户端JavaScript。不要在控制器上执行new操作。 JavaScript创建页面元素。 create动作成为JSON API端点,从而避免了Ruby应用程序中的问题。这显然是一个重大的架构偏离我认为你今天的地方。
  2. 使用一点JavaScript动态加载正确的&#39;部分&#39;当用户在选项之间切换时进入DOM。通过有效地分离“页面”来避免问题中的根本问题。两个控制器。页面→注册操作不需要为视图设置任何实例变量。 JavaScript处理部分加载。 (请参阅&#39; link_to&#39;以及&#39;远程&#39;选项)
  3. 不要在同一个HTML页面中包含这两个表单,默认为一个,例如 Customer ,并提供导航到代理的链接一个,例如选项卡中的链接,或像&#34;不是客户的普通链接?注册为代理。&#34;在这种情况下,您有一个巧妙的映射到Ruby MVC设计,每个页面只是其相关控制器的new操作。缺点是页面加载要在两个选项之间进行更改。这是最简单,最简单的选择......如果你能让老板同意UX。 PS:如果你正在使用turbolinks,那么感觉&#39;浏览器中此选项的选项与选项(2)不远。
  4. 坚持你的设计
  5. 请记住,您将很难使用选项(4)处理错误条件和消息。你可以做到,但代码不会简单或易于维护。

    如果必须使用选项(4),则可以在每个控制器上执行create操作,以便在出现错误时呈现自己的new。如果您提交了代理商&#39;从您的起始页面,有错误,到代理→创建操作,该操作以render 'new'完成,以向用户显示代理→新页面。没有&#39;客户&#39;表格是可见的。然后,您可以在其中添加一个选项(3)和#34;非代理?注册为客户。&#34;表格下的链接。这样做可以大大简化您的错误处理。

    然后会针对您的原始问题提出建议。作弊。请勿为@customer操作(或new操作)设置registration实例变量。对客户和代理表单使用partials,并将新对象传递给form_for,例如

    页/ registration.html.erb

    <%= render 'customers/new_form' %>
    <%= render 'agents/new_form' %>
    

    客户/ new.html.erb

    <%= render 'customers/new_form' %>
    

    客户/ _new_form.html.erb

    <% form_for Customer.new do |f| %>
      <%# include the inputs shared with the edit action %>
      <%= render 'fields', f %> 
      <%= f.submit %>
    <% end %>
    

    客户/ _fields.html.erb

    <%# 'f' is one of the locals passed to the partial %>
    <% f.input_field :name %>
    <% f.email_field :email %>
    <% f.password_field :password %>
    

    客户/ edit.html.erb

    <% form_form @customer do |f| %>
      <%= render 'fields', f %>
      <%= f.submit %>
    <% end %>
    

    ...那么你会遵循相同的模式:

    • 剂/ new.html.erb
    • 剂/ _new_form.html.erb
    • 剂/ _fields.html.erb
    • 剂/ edit.html.erb