Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 创建表单以更新关系表和模型表_Ruby On Rails_Ruby On Rails 3.2_Has Many Through - Fatal编程技术网

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

Ruby on rails 创建表单以更新关系表和模型表,ruby-on-rails,ruby-on-rails-3.2,has-many-through,Ruby On Rails,Ruby On Rails 3.2,Has Many Through,我有3种型号: 事件 卖主 供应商关系 通过这种关系,每个活动都有多个供应商 现在我想在/events/1/add\u vendors创建一个表单,它创建了关系并创建了供应商模型 我该怎么做呢 谢谢你的帮助 确保您是事件模型看起来是这样的: attr_accessible :vendor_relationships, :vendor_relationships_attributes has_many :vendor_relationships has_many :vendors, :thro

我有3种型号:

  • 事件
  • 卖主
  • 供应商关系
通过这种关系,每个活动都有多个供应商

现在我想在/events/1/add\u vendors创建一个表单,它创建了关系并创建了供应商模型

我该怎么做呢


谢谢你的帮助

确保您是
事件
模型看起来是这样的:

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

accepts_nested_attributes_for :vendor_relationships
attr_accessible :vendors, :vendors_attributes
has_many :vendors

accepts_nested_attributes_for :vendors
您的
供应商关系
模型如下所示:

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

accepts_nested_attributes_for :vendor_relationships
attr_accessible :vendors, :vendors_attributes
has_many :vendors

accepts_nested_attributes_for :vendors
在您的
事件控制器中

@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创建,并在创建时将供应商信息返回表单。保存关系将调用ajax创建供应商关系并显示结果

希望这能给你带来正确的方向。

\code>#routes.rb
# 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 %>
资源:活动可以吗 资源:供应商,:路径\u名称=>{:new=>'添加\u供应商'} 结束 #供应商(u controller.rb) 前\u过滤器:加载\u事件 在\u筛选器:加载\u供应商之前,:only=>[:编辑,:更新,:销毁] def加载单元供应商 @供应商=(@event?@event.vendors:vendor).find(参数[:id]) 结束 def load_事件 @事件=参数[:事件\u id]。是否存在?Event.find(参数[:Event_id]):nil 结束 def新 @供应商=@事件@event.vendors.build:Vendor.new ... 结束 def创建 @供应商=@事件@event.vendors.build(params[:vendor]):vendor.new(params[:vendor]) ... 结束 定义编辑 ... 结束 def更新 ... 结束 def销毁 ... 结束 #视图形式 ...
运行@vendor.vendorships.build()之类的程序时会发生什么?这是否创建了vendorship对象?我想我错过了一些rails理论。谢谢,你的回答为我指明了正确的方向。最后,我只是为供应商创建了一个表单,将event_id作为隐藏字段传入,然后在供应商控制器中创建了关系模型(vendorship)。