2013-12-12 62 views
2

我在這方面很難找到信息,但認爲解決方案很簡單。總之,我需要能夠一次向一個模型添加多個條目。用戶故事是這樣的:用戶選擇「添加新的」並且被引導到他們可以簡單地添加一個條目或者選擇他們想要添加的期望條目的下拉的頁面。在一個模型上創建多個條目 - Ruby on Rails(非嵌套)

我看到的所有帖子都有關於使用嵌套對象的信息,但我只使用了一個模型。我是否需要遵循相同的協議?有一種更簡單的方法嗎?自從剛入門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

必須有更好的方法,但這是一個辦法。 (注意我通常使用'Form對象',但在本例中我只使用原始集合):

在您的控制器中將傳遞給新窗體的對象更改爲數組(在本例中,我將預填充它):

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然而,這是處理更經典的嵌套模型。

+0

缺少模板票據/創建,應用程序/創建是我現在收到的唯一錯誤,在此工作並將分享我找到的!再次感謝你的幫助! – nathanielelliott

+0

這個過程似乎正在失去陣列。有沒有人看過這個呢? – nathanielelliott

0

無法保存用戶想購買一個變量門票數量,然後傳遞整數一個次循環?像這樣:

#gets from form 
ticket_buys = gets.chomp 

ticket_buys.times do Ticket.new(ticket_params) 
+0

我曾嘗試類似的東西,但無法弄清楚表單邊迭代通過我收到的chomp。當我迭代時,我總是收到錯誤的意外$ end。 – nathanielelliott

+0

嗯。您可以將數量作爲票證模型的屬性進行分配嗎? –

+0

我剛剛用我開始的想法更新了它,但無法通過該錯誤。 – nathanielelliott

相關問題