0

我在使用多态关联进行用户注册时遇到了问题。我想显示来自多个多态关联模型的字段,但我不能。

模型类:

class User < ActiveRecord::Base
  devise ...

  belongs_to :userable, :polymorphic => true
end

class Advisor < ActiveRecord::Base
  has_one :user, :as => :userable
  attr_accessible :extra
  accepts_nested_attributes_for :user # Idon't know if it is ok
end
class AnotherKingOfUser < ActiveRecord::Base
  #the same..
end

我想为每个特定的用户类型制作一个控制器,所以:

class AdvisorsController < ApplicationController
  # GET /advisors/new
  # GET /advisors/new.json
  def new
    # Here is where I'm not sure about what I did. I tried all variants buy any works for me.
    @advisor = Advisor.new
    @advisor.build_user

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @advisor }
    end
  end
end

而我的观点:

<%= form_for(@advisor) do |f| %>
  <% if @advisor.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@advisor.errors.count, "error") %> prohibited this advisor from being saved:</h2>

      <ul>
      <% @advisor.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

 <% #f.fields_for :user do |ff| %>
 <% f.fields_for :user_attributes, @advisor.user||User.new do |ff| %>

    <div class="field">
      <%= ff.label :email %><br />
      <%= ff.text_field :email %>
    </div>

    <div class="field">
      <%= ff.label :password %><br />
      <%= ff.text_field :password %>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :bio %><br />
    <%= f.text_field :bio %>
  </div>


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

所以在我的浏览器中只出现“bio”字段,但不会出现来自用户模型(设计)的扩展字段。

4

2 回答 2

1

当您在这样的表单中使用关联时(通常accepts_nested_attributes_for在您的情况下使用类似),您需要创建对象以便它们显示在表单上。

这意味着在这里,当 rails 构建您的表单时,它会查找其内容@advisor.user为空的,因为我猜在您的控制器中您做了类似的事情

@advisor = Advisor.new

所以如果你想让用户的字段出现,你需要build一个用户

@advisor = Advisor.new
@advisor.build_user # this will create a instance of User, but will not persist it

有了那个 rails 会在构建表单时找到用户,然后显示你想要的字段。

我希望这能回答你的问题。

于 2013-03-16T23:31:20.500 回答
1
class Advisor < ActiveRecord::Base
  has_one :user, :as => :userable
  attr_accessible :extra, :user_attributes
  accepts_nested_attributes_for :user # its ok
end

class AdvisorsController < ApplicationController

  def new
    @advisor = Advisor.new
    # @advisor.build_user   # unnecessary

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @advisor }
    end
  end
end

# view
<%= form_for(@advisor) do |f| %>
  <%= f.fields_for :user_attributes, @advisor.user||User.new do |ff| %>
    <div class="field">
      <%= ff.label :email %><br />
      <%= ff.text_field :email %>
    </div>
    <div class="field">
      <%= ff.label :password %><br />
      <%= ff.text_field :password %>
    </div>
  <% end %>
    ...
<% end %>
于 2013-03-17T09:35:17.603 回答