在一个模型上创建多个条目 - Ruby on Rails(非嵌套)

时间:2013-12-12 15:17:28

标签: ruby-on-rails ruby ruby-on-rails-3

我很难找到相关信息,但认为解决方案很简单。简而言之,我需要能够一次向一个模型添加多个条目。用户故事如下所示:用户选择“添加新”并指向他们只能添加一个条目的页面,或者选择他们想要添加的所需条目的下拉列表。

我看到的所有帖子都有关于使用嵌套对象执行此操作的信息,但我只使用一个模型。我需要遵循相同的协议吗?有更简单的方法吗?我刚刚从Ruby那里寻找错误的术语吗?

基本应用程序如下所示:

ticket_controller.rb

def new
   @ticket = Ticket.new
end
def create
tnum = gets.chomp
tnum.times do Ticket.new(ticket_params)

respond_to do |format|
  if @ticket.save
    format.html { redirect_to @ticket, notice: 'Ticket was successfully created.' }
    format.json { render action: 'show', status: :created, location: @ticket }
  else
    format.html { render action: 'new' }
    format.json { render json: @ticket.errors, status: :unprocessable_entity }
  end
end
end

new.html.erb

<h1>New ticket</h1>

<%= render 'form' %>

<%= link_to 'Back', tickets_path %>

我在整个网站上看过,只是觉得我错过了什么!谢谢你指点我需要的方向。

_form.html.erb

<%= form_for(@ticket) do |f| %>
<% tnum.times do |index|%>
  <div class="field">
    <%= f.label :type %><br>
    <%= f.text_field :type %>
  </div>
  <div class="field">
    <%= f.label :amount %><br>
    <%= f.text_field :amount %>
  </div>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

2 个答案:

答案 0 :(得分:2)

必须有更好的方法,但这是一种方法。 (注意我通常使用'表单对象',但对于此示例,我将只使用原始集合):

在你的控制器中,将传递给新表单的对象更改为一个数组(在这种情况下,我将预先填充它):

  def new
    @tickets = [Ticket.new(title: 'New Ticket')]
  end

然后在新模板中,您需要更新它以迭代票证数组:

<%= form_tag tickets_path do |f| %>

  <% @tickets.each do |ticket| %>
    <%= fields_for "tickets[#{ticket.object_id}]", ticket do |builder| %>
      <%= render 'ticket_fields', f: builder %>
    <% end %>
  <% end %>

  <%= link_to_add_ticket "Add Tickets" %>

  <%= submit_tag %>
<% end %>

票证字段部分如下:

<fieldset>
  <%= f.label :content, "Ticket" %><br />
  <%= f.text_field :title %><br />
</fieldset>

为了更好的衡量,添加帮助程序以允许您动态添加新票证:

module TicketsHelper

  def link_to_add_ticket(name)
    # create a new object for the form
    new_object = Ticket.new

    # get an id for javascript to hook into
    id = new_object.object_id

    fields = fields_for("tickets[#{id}]", new_object) do |builder|
      render("ticket_fields", f: builder)
    end
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
  end

end

你需要一些咖啡脚本来连接它:

jQuery ->
  $('form').on 'click', '.add_fields', (event) ->
    time = new Date().getTime()
    regexp = new RegExp($(this).data('id'), 'g')
    $(this).before($(this).data('fields').replace(regexp, time))
    event.preventDefault()

基本上所有这些都是对这个railscast的改编,这可能会有所帮助:http://railscasts.com/episodes/196-nested-model-form-revised然而,这是处理更经典的嵌套模型。

答案 1 :(得分:0)

难道您无法将用户想要购买的票证数量保存到变量中,然后将该整数传递给时间循环吗?像这样:

#gets from form
ticket_buys = gets.chomp

ticket_buys.times do Ticket.new(ticket_params)