使用相同视图创建两种类型的资源

时间:2016-06-22 11:51:41

标签: ruby-on-rails ruby-on-rails-4

我有2个模型(和资源) - 学院和管理员。

我希望有一个带有1个提交按钮的视图,可以创建2种类型的资源。我需要2个单独的表格吗?一个例子就是很棒!

此外,此视图应使用哪种命名约定(假设它创建了2种类型的资源)。

学院和管理员之间存在“有很多共同点”的关联。

2 个答案:

答案 0 :(得分:0)

您想要的是名为Form Object的设计模式。

https://robots.thoughtbot.com/activemodel-form-objects

使用表单对象,您可以创建表示表单的类,验证数据,然后持久保存到您需要的资源(或资源)。

还有一个名为Virtus的宝石。对我来说,如果你想要的东西很简单,那就太过分了。您可以创建一个ActiveModel模型并完成您的工作。

答案 1 :(得分:0)

Would I need to have 2 separate forms? 

答案是非。你可以把一个表格嵌套。

例如:Gessing your"有很多通过"像这样的协会:一个学院有许多管理员通过会议

模特:

class Institute < ActiveRecord::Base
  has_many :mettings
  has_many :admins, :through => :mettings
  accepts_nested_attributes_for :mettings
end
class Admin < ActiveRecord::Base
  has_many :mettings
  has_many :institues, :through => :mettings
  accepts_nested_attributes_for :mettings
end
class Metting < ActiveRecord::Base
  belongs_to :institue
  belongs_to :admin
  accepts_nested_attributes_for :institues
end

控制器:

def new
  @institue= Institue.new 
  @metting= @institue.mettings.build
  @admin = @metting.build_admin
end

def create
  Institue.new(institue_params)
end


def institue_params
   params.require(:institue).permit(:id, mettings_attributes: [:id, :metting_time, admin_attributes: [:id ] )
end

视图可以在edit.erb.rb中包含_form.erb.rb:

<% form_for(@institue) do |institue_form| %>
  <%= institue_form.error_messages %>
  <p>
    <%= institue_form.label :name, "Institue Name" %>
    <%= institue_form.text_field :name %>
  </p>

  <% institue_form.fields_for :mettings do |metting_form| %>
    <p>
      <%= metting_form.label :metting_date, "Metting Date" %>
      <%= metting_form.date_field :metting_date %>
    </p>

    <% metting_form.fields_for :admin do |admin_form| %>
      <p>
        <%= admin_form.label :name, "Admin Name" %>
        <%= admin_form.text_field :name %>
      </p>
    <% end %>
  <% end %>

  <p>
    <%= institue_form.submit 'Create' %>
  </p>
<% end %>

<%= link_to 'Back', institues_path %>