Я близок к крайнему сроку выполнения проекта колледжа (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.
Возникает вопрос, как мне заставить ассоциации работать?
Отредактировал теги. Ваша IDE/инструменты здесь действительно неуместны. Тег rubymine
действительно следует использовать для ответов, которые касаются самого редактора. И rubygems
для вопросов, касающихся команды gem
.
На самом деле это просто стандартный заурядный вложенный ресурс, который вы описываете. Я действительно не знаю, что делать с беспорядком кода в вашем вопросе, но способ 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 %>
должно быть
@shipment.courier = @courier
, а не@shipment.courier<< @courier