2010-11-13 3 views
3

Я новичок в Rails, и немного запутался о маршрутах:Как сделать маршрут к пользовательскому действию контроллера в Rails 3?

У меня есть контроллер устройств:

#devices_controllers.rb 
class DevicesController < ApplicationController 

    def index 
    @devices = Device.all 
    end 

    def show 
    @device = Device.find(params[:id]) 
    end 

    def new 
    @device = Device.new 
    end 

    def create 
    @device = Device.new(params[:device]) 
    if @device.save 
     flash[:notice] = "Successfully created device." 
     redirect_to @device 
    else 
     render :action => 'new' 
    end 
    end 

    def edit 
    @device = Device.find(params[:id]) 
    end 

    def update 
    @device = Device.find(params[:id]) 
    if @device.update_attributes(params[:device]) 
     flash[:notice] = "Successfully updated device." 
     redirect_to @device 
    else 
     render :action => 'edit' 
    end 
    end 

    def destroy 
    @device = Device.find(params[:id]) 
    @device.destroy 
    flash[:notice] = "Successfully destroyed device." 
    redirect_to devices_url 
    end 

    def custom_action 
    "Success" 
    end 

я хотел бы получить доступ к «custom_action» действие через URL, как это:

http://foo.bar/devices/custom_action 

Я добавил эту строку в мой routes.rb файл:

match 'devices/custom_action' => 'devices#custom_action' 

Однако, когда я пытаюсь URL в браузере, я получаю эту ошибку:

ActiveRecord::RecordNotFound in DevicesController#show 

Couldn't find Device with ID=custom_action 

Он, кажется, собирается #show действия вместо #custom_action. Если идентификатор пользователя не указан, и я перехожу к http://foo.bar/devices/custom_action, я бы хотел, чтобы он пошел #custom_action.

Я читал Rails Routing from the Outside, но все еще, похоже, не может решить проблему.

ответ

3

Я думаю, что проблема может быть из-за порядка, в котором вы определили свои маршруты.

Я подозреваю, что у вас есть resources :devices в вашем routes.rb. Кроме того, я подозреваю, что вы определили свой собственный маршрут после. Если вы наберете rake routes в вашей консоли/терминале, вы увидите, что уже существует маршрут определяется по следующей схеме:

GET  /devices/:id 

Этот маршрут является продуктом resources :devices, который берет верх над пользовательского маршрута. Возвращаясь к Руководствам по границам, в частности в 1.1. Connecting URLs to Code, говорится, что запрос будет отправлен на соответствующий маршрут . Поэтому простым решением было бы определить ваш пользовательский маршрут до resources :devices.

+0

Спасибо, John, у меня есть 'resources: devices' до моего пользовательского маршрута в файле' routes.rb'. Я просто переместил пользовательский маршрут, чтобы он был выше «ресурсов: устройств», и теперь он работает. Благодаря!! – Chanpory

+0

Нет проблем. Рад, что смог помочь. знак равно – John