Вложенные ресурсы, simple_form_for - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь создать приложение, в котором у меня есть События, и каждое событие будет иметь много продаж.Когда создается новая продажа, она автоматически получает идентификатор события, которому она принадлежит.Может кто-нибудь, пожалуйста, просмотрите это и скажите мне, если я делаю что-то не так, потому что я думаю, что способ создания simple_form для вложенной модели (Sale) немного неправильный.Также я не уверен, что так должно быть, или я сделал что-то не так, но когда я обращаюсь к вложенным детям, URL выглядит так:

.../events/4/sales/1 
.../events/3/sales/1 
.../events/5/sales/1 

, но я ожидаю, что это будет так ?!

.../events/4/sales/1 
.../events/4/sales/2 
.../events/4/sales/3 

Вот мой контроллер и модель для События

class Event < ApplicationRecord
  has_many :sales, dependent: :destroy
end

.

class EventsController < ApplicationController

  def index
    @events = Event.all
  end

  def new
    @event = Event.new
  end

  def create
    @event = Event.new(event_params)

    if @event.save
      redirect_to @event
    else
      redirect_to events_path
    end
  end

  def show
    @event = Event.find(params[:id])
    @sales = @event.sales
  end

  private

  def event_params
    params.require(:event).permit(:name, :comment, :event_disscount)
  end
end

.Вот мой контроллер и модель для Продажи

class Sale < ApplicationRecord
  belongs_to :event
  has_many :sale_items

  accepts_nested_attributes_for :sale_items, allow_destroy: true
end

.

class SalesController < ApplicationController
  def new
    @sale = Sale.new(event_id: params[:event_id])
    @event = Event.find_by(id: params[:event_id])
  end

  def create

    @event =  Event.find(params[:event_id])
    @sale = @event.sales.create(params[:sale].permit(:receipt_email))

    if @sale.save
      redirect_to @event
    else
      redirect_to new
    end
  end
end

rout.rb

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  resources :events do
    resources :sales
  end
  root 'events#index'

end

И вот как я использую simple_form для продажи (новый)

<%= simple_form_for([@event, @sale])  do |f| %>

Моя главная задача - «новое» действие в контроллере продаж, что является лучшим способом создания вложенного ресурса с идентификатором его родителя, а затем передать этот объект в simple_form?!

Заранее спасибо

1 Ответ

0 голосов
/ 11 октября 2018

Ваш вопрос слишком широкий.В принципе, вы все делаете правильно, однако, с некоторыми улучшениями в коде будет легче найти возможные проблемы.

Правильно ли я создаю новую продажу?

Некоторые улучшения по сравнению с SalesController:

  1. Создать приватный метод sale_params, который будет очищать входные параметры из вашей формы.Вы уже сделали это для событий - почему бы не сделать это и здесь?

  2. Поскольку этот контроллер работает в области событий, params[:event_id] устанавливается для каждого действия.Поэтому создайте фильтр before_action, который установит переменную @event.

  3. Метод create сохраняет модель в базе данных, поэтому вызывать save после того, как это не имеет смысла.

  4. В случае сбоя при сохранении @sale в БД перенаправление на new нецелесообразно.В этом случае все, что пользователь ввел в форму, будет потеряно, ошибка проверки не будет отображаться, и это будет выглядеть как сбой вашего приложения.Вместо этого визуализируйте шаблон new с тем же @sale.

Вот как я бы переписал ваш контроллер:

class SalesController < ApplicationController
  before_action: :set_event

  def new
    @sale = @event.sales.build
  end

  def create
    @sale = @event.sales.build(sale_params)

    if @sale.save
      redirect_to @event
    else
      render action: :new
    end
  end

  private

  def sale_params
    params.require(:sale).permit(:receipt_email, sale_items_attributes: [])
  end

  def set_event
    @event = Event.find(params[:event_id])
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...