Как мне сделать маршрут к пользовательскому действию контроллера в Rails 3? - PullRequest
3 голосов
/ 13 ноября 2010

Я новичок в Rails, и немного запутался в маршрутах:

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

#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

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

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

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

ActiveRecord::RecordNotFound in DevicesController#show

Couldn't find Device with ID=custom_action

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

Я прочитал Маршрутизация с внешней стороны , но все еще не могу решить проблему.

1 Ответ

3 голосов
/ 13 ноября 2010

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

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

GET     /devices/:id

Этот маршрут является продуктом resources :devices, который имеет приоритетпо вашему заказному маршруту.Возвращаясь к разделу «Пограничные направляющие», в частности, в 1.1.Соединяя URL-адреса с кодом , он сообщает, что запрос будет отправлен на соответствующий маршрут first .Так что простым решением было бы определить свой собственный маршрут до resources :devices.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...