创建表单以更新关系表和模型表

时间:2013-01-07 04:22:37

标签: ruby-on-rails ruby-on-rails-3.2 has-many-through

我有3个型号:

  • 事件
  • 供应商
  • vendor_relationship

每个事件都有多个供应商通过这种关系。

现在我想在/ events / 1 / add_vendors创建一个表单来创建关系并创建供应商模型。

我将如何做到这一点?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

确保您的Event模型看起来像这样:

attr_accessible :vendor_relationships, :vendor_relationships_attributes
has_many :vendor_relationships
has_many :vendors, :through => :vendor_relationships

accepts_nested_attributes_for :vendor_relationships

您的VendorRelationship模型看起来像这样:

attr_accessible :vendors, :vendors_attributes
has_many :vendors

accepts_nested_attributes_for :vendors

EventController

@event = Event.new(params[:event])

并在您的创建视图中,例如:

<% form_for Event.new do |f| %>
  <%= f.text_field, :field_for_the_event %>
  <% f.fields_for :vendor_relationships do |rf| %>
    <%= rf.text_field, :price_maybe? %>
    <% rf.fields_for :vendor do |vf| %>
      <%= vf.text_field, :name_and_so_on %>
    <% end %>
  <% end %>
<% end %>

这是一种方式。另一个可能更好的用户体验是允许从现有供应商中选择供应商或创建新的供应商。为VendorController创建新的ajax创建,并在创建时将供应商的信息返回给表单。保存关系会调用create_relationship并显示结果。

希望能让你朝着正确的方向前进。

答案 1 :(得分:0)

# routes.rb

resources :events do
  resources :vendors, :path_names => { :new => 'add_vendors' }
end

# vendors_controller.rb

before_filter :load_event
before_filter :load_vendor, :only => [:edit, :update, :destroy]

def load_vendor
  @vendor = (@event ? @event.vendors : Vendor).find(params[:id])
end

def load_event
  @event = params[:event_id].present? ? Event.find(params[:event_id]) : nil
end

def new
  @vendor = @event ? @event.vendors.build : Vendor.new
  ...
end

def create
  @vendor = @event ? @event.vendors.build(params[:vendor]) : Vendor.new(params[:vendor])
  ...
end

def edit
  ...
end

def update
  ...
end

def destroy
  ...
end

# View form

<%= form_for([@event, @vendor]) do |f| %>
  ...
<% end %>