我很难找到相关信息,但认为解决方案很简单。简而言之,我需要能够一次向一个模型添加多个条目。用户故事如下所示:用户选择“添加新”并指向他们只能添加一个条目的页面,或者选择他们想要添加的所需条目的下拉列表。
我看到的所有帖子都有关于使用嵌套对象执行此操作的信息,但我只使用一个模型。我需要遵循相同的协议吗?有更简单的方法吗?我刚刚从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 %>
答案 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)