Tengo un problema para entender cómo configurar las rutas en rieles para pasar un objeto al asistente de URL.
Agregué un nuevo método add_item
def add_item @item = Item.create(item_params) puts @hospital.inspect puts @item.inspect @hospital.items << @item respond_to do |format| if @hospital.save format.html { redirect_to hospital_url(@hospital), notice: "Item was added to hospital" } format.json { render :show, status: :ok, location: @hospital } else format.html { render :edit, status: :unprocessable_entity } format.json { render json: @hospital.errors, status: :unprocessable_entity } end end endAgregué la ruta correspondiente
resources :hospitals do member do post :add_item end endpero cuando ejecuto mi prueba que usa
post add_item_hospital_url(@hospital), params: { item: { item_code: item.item_code, description: item.description, gross_charge: item.gross_charge } }el @hospital en la prueba no es nulo, pero en el controlador, lo es. ¿Qué estoy haciendo mal? Mis rutas parecen estar bien.
add_item_hospital POST /hospitals/:id/add_item(.:format)La variable de instancia @hospital es nil en el controlador porque no se ha configurado. Tal vez podría agregar un before_action para establecer el valor de la variable de instancia o simplemente agregarlo al método add_item .
Al pasar modelos al asistente de URL, la identificación de ese objeto se puede encontrar dentro del hash de parámetros
class HospitalsController < ApplicationController before_action :set_hospital, only: :add_item def add_item # ... your code here end private def set_hospital @hospital = Hospital.find(params[:id]) rescue ActiveRecord::RecordNotFound # handle exception end end