2014-10-17 7 views
0

Так я мое приложение установить с идентификаторами, как так:Получение идентификатора модели, использующей Вложенные маршруты и Permalinks в Rails

resources :studios do 
    resources :bookings 
    end 

Это дало мне путь к индексу (который позже я собираюсь использовать JSON для получить календари для каждой студии.

studio_bookings GET /studios/:studio_id/bookings(.:format)   bookings#index 

Это хорошо, но я хотел бы избавиться от ID и использовать постоянную ссылку вместо этого, только для дружелюбного URL.

Переключает :

namespace :studio, :path =>'/:permalink' do 
    resources :bookings 
    end 

Теперь я получаю

studio_bookings GET /:permalink/bookings(.:format)  studio/bookings#index 

Отлично! это, как я хочу, чтобы мой URL, чтобы посмотреть, однако, в настоящее время: идентификатор не где-нибудь в пути так ... Я получаю

Couldn't find Booking without an ID 

Это даже и не передается. Есть ли способ передать: id с URL-адресом без его фактического использования в URL-адресе? В противном случае я могу изменить первичный ключ от: id до: permalink, чтобы исправить это?

Я попытался изменить мой контроллер от

@studio = Studio.find(params[:id]) 

в

@studio = Studio.find(params[:permalink]) 

, но это дает мне

Couldn't find Booking with 'id'=40frost 

Который говорит мне, что я делаю на самом деле не означает, сделать? Он пытается установить постоянную ссылку как идентификатор, поэтому, хотя я рассказываю о том, что рельсы ищут постоянную ссылку, она все еще выглядит как идентификатор.

Надеюсь, моя проблема ясна: по существу - как я могу передать идентификатор, чтобы он знал, какая студия не отображает ее в URL-адресе. Если есть какая-то контрольная магия, которую я могу сделать, это будет удобно.

Вот мой контроллер для ровного

class Studio::BookingsController < ApplicationController 
before_action :set_booking, only: [:show, :edit, :update, :destroy] 

    # GET /bookings 
    # GET /bookings.json 
    def index 
    @studio = Studio.find(params[:permalink]) 
    @bookings = Booking.where("studio_id => '@studio.id'") 
    end 

    # GET /bookings/1 
    # GET /bookings/1.json 
    def show 
    end 

    # GET /bookings/new 
    def new 
    @booking = Booking.new 
    end 

    # GET /bookings/1/edit 
    def edit 
    end 

    # POST /bookings 
    # POST /bookings.json 
    def create 
    @booking = Booking.new(booking_params) 

    respond_to do |format| 
     if @booking.save 
     format.html { redirect_to @booking, notice: 'Booking was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @booking } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @booking.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /bookings/1 
    # PATCH/PUT /bookings/1.json 
    def update 
    respond_to do |format| 
     if @booking.update(booking_params) 
     format.html { redirect_to @booking, notice: 'Booking was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @booking.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /bookings/1 
    # DELETE /bookings/1.json 
    def destroy 
    @booking.destroy 
    respond_to do |format| 
     format.html { redirect_to bookings_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_booking 
     @booking = Booking.find(params[:permalink]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def booking_params 
     params.require(:booking).permit(:start_time, :end_time, :studio_id, :engineer_id, :title, :allDay) 
    end 
end 

ответ

1

Вы можете просто сделать

self.primary_key = 'permalink' 

в модели студии, или вы могли бы сделать

def index 
    @studio = Studio.find_by permalink: params[:permalink] 
    @bookings = Booking.where(studio_id: @studio.id) 
end 

зависит, если вы просто хотите локально изменить поведение или адрес модели Studio постоянно.

Надеюсь, что это поможет!

+0

спасибо. Я пошел со вторым методом. – Peege151

+1

Это, вероятно, разумно, потому что вы захотите использовать свои идентификаторы для извлечения записей для обновления и прочее, удачи там! – jfornoff