Rails 5 - fields_for и update action - не могу понять, как обновить / сохранить - PullRequest
0 голосов
/ 25 сентября 2018

Каждый день для каждого 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 %>

1 Ответ

0 голосов
/ 25 сентября 2018

Вероятно, не "путь рельсов", но это работает ..

  def update
    if @daily.update_attributes(daily_params)
      params["services"].each do |k,v|
        data = DailyDatum.find(k)
        data.update_attributes(service_params(v))
      end
      redirect_to daily_path(@daily)
    else
      render 'edit'
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...