Ruby on rails 将表格“U”与“U”一起使用;变成「;失学儿童协会

Ruby on rails 将表格“U”与“U”一起使用;变成「;失学儿童协会,ruby-on-rails,associations,Ruby On Rails,Associations,在构建处理STI的表单时,如果我使用变为将对象转换为其父类,我将失去使用嵌套字段的能力 我有两种型号 class Login < ActiveRecord::Base belongs_to :user end class User < ActiveRecord::Base has_one :login accepts_nested_attributes_for :login end 下面是最相关的表单视图位 <%= simple_form_for(@user.

在构建处理STI的表单时,如果我使用
变为
将对象转换为其父类,我将失去使用嵌套字段的能力

我有两种型号

class Login < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_one :login

  accepts_nested_attributes_for :login
end
下面是最相关的表单视图位

<%= simple_form_for(@user.becomes(User), html: {class: "user-form"}) do |f| %>

  <%= f.simple_fields_for :login do |l| %>
    <div class="field">
      <%= l.label :email %><br />
      <%= l.email_field :email %>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :type %>
    <%= f.select :type, options_for_select(current_user.types_can_create), include_blank: "- Select -", class: "form-control", id: "select_type" %>
  </div>

  <div class="actions">
    <%= f.submit "Register" %>
  </div>
<% end %>


:email
的文本字段不显示,因为
@user.login
现在是
nil
。使用
时是否会出现这种预期行为?

以前只使用过一次,我只能证明我的经验不足——无论何时使用它,它都会调用类的新实例

我不确定具体细节,但底线是我猜测您的
@user.been(user)
将覆盖
@user.build\u登录

返回具有当前记录属性的指定klass的实例

--

在您的情况下,我会显式地设置路径(因为您使用的是
User
):


以前只使用过一次,我只能证明我的经验不足——无论何时使用它,它都会调用该类的一个新实例

我不确定具体细节,但底线是我猜测您的
@user.been(user)
将覆盖
@user.build\u登录

返回具有当前记录属性的指定klass的实例

--

在您的情况下,我会显式地设置路径(因为您使用的是
User
):


在Rails 5中,这可以通过

<%= form_with scope: :user,
              model: @user,
              url: @user.id ? user_path(user) : users_path,
              local: true do |f| %>
  ...
  ...
<% end %>

...
...

前面的代码指示FormBuilder使用@user属性填充字段,但它也指示FormBuilder提交到主路由(而不是继承的路由),并且在
作用域:
中,它还指示FormBuilder使用
用户
类名而不是子类名来命名字段。

在Rails 5中,这可以通过以下方法解决:

<%= form_with scope: :user,
              model: @user,
              url: @user.id ? user_path(user) : users_path,
              local: true do |f| %>
  ...
  ...
<% end %>

...
...

前面的代码指示FormBuilder使用@user属性填充字段,但它也指示FormBuilder提交到主路由(而不是继承的路由),并且在
范围:
中,它还指示FormBuilder使用
用户
类名命名字段,不是子类名称。

谢谢-我没有默认使用它的唯一原因是因为它会导致控制器中的强参数出现问题。我无法再指定
参数require(:user).
。如果我必须破解它,没什么大不了的。谢谢您的反馈。@AlecSanger这是一个老问题,但您可以将
设置为::user
,整个表单将以前缀
user[]
发布——您可以随意使用,
as::foo
将以
foo[]的形式发布
谢谢-我没有默认的唯一原因是因为它会导致控制器中的强参数出现问题。我无法再指定
参数require(:user).
。如果我必须破解它,没什么大不了的。谢谢您的反馈。@AlecSanger这是一个老问题,但您可以将
设置为::user
,整个表单将以前缀
user[]
发布——您可以随心所欲地发布,
as::foo
将以
foo[]
发布这不适用于,更新/修补,因为表单使用
POST
这不适用,更新/修补,因为表单使用
POST
<%= simple_form_for @user, url: user_path, method: :post html: {class: "user-form"} do |f| %>
<%= form_with scope: :user,
              model: @user,
              url: @user.id ? user_path(user) : users_path,
              local: true do |f| %>
  ...
  ...
<% end %>