我有一个客户控制器。在新操作中,我重定向到另一个页面,该页面属于页面控制器
class CustomersController < ApplicationController
def new
redirect_to register_path
end
是否可以像这样在注册操作中创建对象?
class PagesController < ApplicationController
def registration
@customer = Customer.new
end
end
答案 0 :(得分:0)
我认为设置是这样的:您的应用程序中有一个客户模型,比如代理。您的网站用户注册为任何一个,并且希望拥有一个HTML页面(URL),同时提供这两个选项。他们选择他们是哪一个并提交一些字段,比如姓名/电子邮件/密码。为了简单起见,没有用JavaScript来隐藏选项卡背后的东西,你可以使用以下内容:
**Customer** Name: ___________ Email: __________ Password: _______ [Submit] **Agent** Name: ___________ Email: __________ Password: _______ [Submit]
这里有一些选项可以避免Rails控制器中的内疚感:
new
操作。 JavaScript创建页面元素。 create动作成为JSON API端点,从而避免了Ruby应用程序中的问题。这显然是一个重大的架构偏离我认为你今天的地方。new
操作。缺点是页面加载要在两个选项之间进行更改。这是最简单,最简单的选择......如果你能让老板同意UX。 PS:如果你正在使用turbolinks,那么感觉&#39;浏览器中此选项的选项与选项(2)不远。请记住,您将很难使用选项(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 %>
...那么你会遵循相同的模式: