2016年10月17日 星期一

Cloud9-RoR-one-to-many & create multiple records at once

參考文章:http://vicfriedman.github.io/blog/2015/07/18/create-multiple-objects-from-single-form-in-rails/
rails儲存的方法區別:http://rubyer.me/blog/262/

這次的功能需求是一次能夠存取多筆資料,且剛好是符合一對多的資料型態,先從一對多(user-to-calendars)的設定開始吧!

One-to-Many
User(one),編輯 app/models 底下的 user.rb 檔,加入
  has_many :calendars, :dependent => :delete_all

Calendars(many),一樣編輯 models 下的 calendar.rb,加入
  belongs_to :user

可以注意到 has_many 字尾有{s}(複數), belongs_to 是沒有的(單數)。


Create Multiple Records at Once
編輯calendar_controller.rb
  def new
    @calendar = []
    20.times do
      @calendar << calendar.new
    end
  end

  def create
    if params.has_key?("calendar")
      @calendar = calendar.create(calendar_params(params["calendar"]))
    else
      params["calendars"].each do |calendar|
        if calendar["issave"] && calendar["vdate"] != ""
          @calendar = calendar.create(calendar_params(calendar))
        end
      end
    end

    if @calendar.save
      redirect_to calendars_url
    else
      render :action => :new
    end
    flash[:notice] = "calendar was successfully created"
  end

編輯views/calendars/new.html.erb
<%= form_tag calendars_path do %>
  <% i=0 %>
  <table border="0">
    <tr>
      <td>儲存</td>
      <td>日期</td>
      <td>時間</td>
    </tr>
  <% @calendar.each do |calendar| %>
    <%= fields_for 'calendars[]', calendar do |f| %>
      <tr>
        <td>
        <div>
        <% if i < 1 %>
        <%= hidden_field_tag('calendars[][issave]', true) %>
        <% else %>
        <%= check_box_tag('calendars[][issave]', true) %>
        <% end %>
        <%= f.hidden_field :user_id, :value => current_user.id %>
        </div>
        </td>
        <td>
        <div>
        <%= f.date_field :vdate %>
        </div>
        </td>
        <td>
        <div>
        <%= f.select(:vtime) do %>
          <% (0..23).each do |t| -%>
            <%= content_tag(:option, t.to_s.rjust(2, '0'), value: t) %>
          <% end %>
        <% end %>
        </div>
        </td>
      <% i=i+1 %>
    <% end %>
    </tr>
  <% end %>
  </table>
  <div class="actions">
    <%= submit_tag %>
  </div>
<% end %>

執行後的畫面

完成後在日曆上看不到資料是正常的哦!因為我們還沒將資料套用到日曆上,下一篇就會介紹如何使用json將資料顯示在fullcalendar上哩!

沒有留言:

張貼留言