Rails 3 - 另一个模型中的多个模型形式

时间:2011-03-23 15:13:24

标签: ruby-on-rails forms

我正在构建一个应用程序,我需要在其他多个模型的表中添加行。

这是我到目前为止所做的(对于草率的代码,对于ruby / rails的第一个项目感到抱歉)。我确实意识到我仍然缺少代码的一些关键元素以使其正常运行,我想确保我首先以正确的方式进行此操作。一旦我使一切正常工作,我也会将表格移动到局部。

# app/views/ticketbuilder/show.html.erb    
<ul>
<% @event.sections.each do |s| %>
  <li><%= s.name %></li>
  <ul>
    <% s.locations.each do |l| %>
      <li><%= l.name %></li>
    <% end %>
  </ul>
<% end %>
  <li>
    <%= form_for([:event, :ticketbuilder], :url => event_ticketbuilder_url) do |s| %>
      <%= s.text_field(:section) %> <%= submit_tag("Add Section") %>
      <%= s.hidden_field(:event_id, @event.id) %>
    <% end %>
  </li>
</ul>

# routes.rb
resources :event do
  resources :ticketbuilder
end

# ticketbuilder_controller.rb   
class TicketbuilderController < ApplicationController
  def show
    @event = Event.find(params[:event_id])
  end
  def new
    @section = Section.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @event }
    end
  end
end

# error message
undefined method `model_name' for Symbol:Class

我遇到的问题是将表单发送到ticketbuilder控制器。我想要完成的是获得一个包含子元素的座位区列表。我希望能够直接在列表页面上添加新的部分和位置。

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您需要改变一些事项。首先在TicketbuilderController中的show动作中:

  # TicketbuilderController
  def show
    @event = Event.find(params[:event_id])
    @section = Section.new
  end

@section变量是一个新的Section,它将在下一个视图中的form_for帮助器中使用:

# app/views/ticketbuilder/show.html.erb  
<%= form_for @section, :url => event_ticketbuilder_path(@event) do |s| %>
  <p><%= s.text_field(:section) %></p>
  <p><%= s.submit("Add Section") %></p>
<% end %>

form_for接受您要创建的模型的实例,在本例中为Section。不需要存储event_id的隐藏字段,因为我们将表单数据发送到包含event_id的url。该url在传递给form_for的:url属性中指定。

最后,TicketbuilderController中的创建操作:

# TicketbuilderController
def create
  @event = Event.new(params[:event_id])
  @section = @event.sections.build(params[:section)
  if @section.save
    @section = Section.new
  end
  render :action => :show
end

@event用于“构建”该部分。通过这样做,即使event_id没有在表单中传递,该部分也与事件相关联。如果新部分已成功保存,则@section变量将设置为新实例,以便再次为form_for做准备。

答案 1 :(得分:0)

您应该使用fields_for帮助器。

在railscasts中寻找一个好的教程:http://railscasts.com/episodes/73-complex-forms-part-1