Каждый день для каждого Store
создается Daily
, содержащий DailyDatum
для каждого Service
.Я могу создавать и отображать поля, но не могу заставить их обновить.
Моя проблема заключается в сохранении данных из хеша служб.
Parameters: {"utf8"=>"✓", "authenticity_token"=>"F3JnDp/6TMV7rte24kjBDOjMo17BR/jIdaH2+a5s3AXLtvybhSUM9xbPSn1uvUfL9d7AXUmSeZOM+iz18SnYJA==", "daily"=>{"store_id"=>"1"}, "services"=>{"5"=>{"service_id"=>"1", "value"=>"2"}, "6"=>{"service_id"=>"2", "value"=>"2.0"}, "7"=>{"service_id"=>"3", "value"=>"3.0"}, "8"=>{"service_id"=>"4", "value"=>"4.0"}}, "commit"=>"Update Daily", "store"=>"12", "id"=>"12"}
Хэш служб содержит хеши каждого объекта DailyDatum и их атрибут / значение.
Модель дневных данных
class DailyDatum < ApplicationRecord
belongs_to :daily
belongs_to :service
end
Ежедневная модель
class Daily < ApplicationRecord
has_many :daily_data
belongs_to :store
accepts_nested_attributes_for :daily_data
end
Модель магазина
class Store < ApplicationRecord
has_many :store_users, inverse_of: :store
has_many :users, through: :store_user
has_many :dailies
accepts_nested_attributes_for :store_users, allow_destroy: true
end
Модель пользователя
class User < ApplicationRecord
has_many :store_users, inverse_of: :user
has_many :stores, through: :store_user
accepts_nested_attributes_for :store_users, allow_destroy: true
end
Ежедневный контроллер
class DailyController < ApplicationController
before_action :set_daily, only: [:show, :edit, :update]
before_action :set_services, only: [:edit, :update]
def index
@dailies = Daily.all
end
def show
@daily = Daily.find(params[:id])
end
def store
@dailies = Daily.where(store_id: params[:store])
end
def new
@daily = Daily.new
@services = []
Service.all.each do |s|
service = @daily.daily_data.build
service.service_id = s.id
@services << service
end
end
def edit
end
def create
@daily = Daily.new(daily_params)
if @daily.save
params["services"].each do |service|
data = DailyDatum.new(service_params(service))
data.daily_id = @daily.id
data.save
end
redirect_to dailies_url
else
render 'new'
end
end
def update
if @daily.update_attributes(daily_params)
redirect_to @daily
else
render 'edit'
end
end
private
def set_daily
@daily = Daily.find(params[:id])
end
def set_services
@services = DailyDatum.where(daily_id: @daily.id).where(created_at: @daily.created_at.time.beginning_of_day..@daily.created_at.time.end_of_day)
end
def daily_params
params.require(:daily).permit(:store_id, services: [:daily_id, :service_id, :value])
end
def service_params(my_params)
my_params.permit(:daily_id, :service_id, :value)
end
end
Ежедневный просмотр (частичная форма) для новых и редактирования
<%= form_for(daily) do |f| %>
<% if daily.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(daily.errors.count, "error") %> prohibited this daily from being saved:</h2>
<ul>
<% daily.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.hidden_field :store_id, value: params[:store] %>
<table class="table table-hover">
<thead>
<tr>
<th>Service</th>
<th>Cash In</th>
<th>Cash Out</th>
</tr>
</thead>
<tbody>
<% @services.each do |service| %>
<tr>
<%= fields_for 'services[]', service do |s| %>
<%= s.hidden_field :service_id, value: service.service_id %>
<td><%= s.label :value, service_name(service.service_id) %></td>
<% if ( cash_in(service.service_id) ) %>
<td><%= s.text_field :value %></td>
<td></td>
<% else %>
<td></td>
<td><%= s.text_field :value %></td>
<% end %>
<% end %>
</tr>
<% end %>
</table>
<div class="actions">
<%= f.submit %>
</div>
<% end %>