Как заставить контроллер таблицы отображать ассоциацию внешнего ключа? [Rubymine 2020.2.3, Ruby.2.7.2p137, драгоценный камень 3.1.2]

Я близок к крайнему сроку выполнения проекта колледжа (3 недели), и я столкнулся с несколькими проблемами. Поскольку это проектный курс, я не всегда могу обратиться к своему репетитору.

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

Это метод Create контроллера таблицы «Отправка», в котором я пытаюсь создать ассоциацию с «Курьером», которому принадлежит «Отправка» и «Курьер имеет_много». Следующие строки соответствуют инструкциям документа моего курса:

 @cour_id=params[:shipment][:courier_id]
@courier=Courier.find(@cour_id)
@shipment=Shipment.new(params.require(:shipment).permit(:tracking_number, :shipment_date))
@shipment.courier<< @courier
@shipment.save
redirect_to shipment_path(@shipment)
@shipment=Shipment.new(shipment_new_path)
if @shipment.save
  redirect_to(:controller=>'shipment' ,:action=>'index')
else
  render('new')
end
end

Ассоциации кажутся необходимыми, поскольку одна из форм в файле shipping/new.erb.html представляет собой раскрывающийся список набора записей Courier из одного из столбцов таблицы. Который отображается из этой формы на этой странице.

Проблема, с которой я сталкиваюсь, заключается в строке «@shipment.courier << @courier», «<<» рассматривается как неопределенный метод для nil: NilClass. Я пробовал варианты этой строки кода (@shipment.couriers..., @shipment.courier.id...), но, похоже, это не имеет значения.

скрин ошибки

Я подозреваю, что с этой конкретной таблицей связана более насущная проблема. Я заметил, что даже из серверной части таблица не сохраняет новые записи. Хотя ничем особенно эта таблица не отличается от других. Первоначально я приписывал неспособность передавать данные из-за несоответствия между ассоциациями таблиц, теперь я интерпретирую это как проблему невозможности функционировать без надлежащего подключения к идентификатору таблицы Courier.

Возникает вопрос, как мне заставить ассоциации работать?

должно быть @shipment.courier = @courier, а не @shipment.courier<< @courier

dbugger 21.12.2020 15:32

Отредактировал теги. Ваша IDE/инструменты здесь действительно неуместны. Тег rubymine действительно следует использовать для ответов, которые касаются самого редактора. И rubygems для вопросов, касающихся команды gem.

max 21.12.2020 21:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле это просто стандартный заурядный вложенный ресурс, который вы описываете. Я действительно не знаю, что делать с беспорядком кода в вашем вопросе, но способ Rails сделать это будет:

resources :couriers do
  resources :shipments, 
     only: [:index, :new, :create]
end
class ShipmentsController < ApplicationController
  # use callbacks to avoid repitition
  before_action :set_courier, only: [:new, :create, :index]

  # GET /couriers/1/shipments
  def index
    @shipments = @courier.shipments
  end

  # GET /couriers/1/shipments/new
  def new
    @shipment = @courier.shipments.new 
  end

  # POST /couriers/1/shipments
  def create
    @shipment = @courier.shipments.new(shipment_params)
    if @shipment.save
      # shorthand for courier_shipments_path(@courier)
      redirect_to([@courier, :shipments])
    else
      render(:new)
    end
  end

  private

  # use a private method instead of repeating yourself
  def shipment_params
    params.require(:shipment)
          .permit(:tracking_number, :shipment_date)
  end

  def set_courier
    @courier = Courier.find(params[:courier_id])
  end
end
# app/views/shipments/new.html.erb
<%= form_with(model: [@courier, @shipment]) do |f| %>
  <div class = "field">
    <%= f.label :tracking_number %>
    <%= f.text_field :tracking_number %>
  </div>
  <div class = "field">
    <%= f.label :delivery_date %>
    <%= f.date_field :delivery_date %>
  </div>
  <div class = "actions">
    <%= f.submit %>
  </div>
<% end %>

Другие вопросы по теме