2013-09-09 22 views
20

Я довольно новый в Rails. Извините за вопрос noob.Как добавить новое действие к существующему контроллеру?

Я создать новый контроллер: rails new controller Say hello goodbye

Как я могу добавить новое действие, как «привет» и «до свидания» к этому существующему контроллеру?

ответ

37

Добавить новое действие просто. Все, что вам нужно сделать, это добавить метод на геймпаде, как, например:

# app/controllers/dummy_controller.rb 
def get_back 
    logger.warn "It works!" 
    redirect_to :back 
end 

Теперь, чтобы быть в состоянии получить доступ к этой акции throgh в URL, вам нужно иметь маршрут для этого. Это делается в файле config/routes.rb. Вы можете добавить его как жесткий маршрут, например

get '/go_back', to: "dummy#get_back" 

Это самый простой маршрут. Но вы можете хотеть, чтобы он вел себя как спокойный маршрут. Это полезно, если вы выполняете действие над одной или несколькими моделями. Так что ваши в файле маршрута, вы будете иметь что-то вроде этого:

resources :dummy do 
    collection do 
    get 'get_back' 
    end 
end 

Это позволяет принимать get метод над коллекцией. У вас будет помощник dummy_go_back_url, и для перехода на эту страницу будет /dummies/go_back.

Это предназначение для работы над набором ресурсов. Если вы действуете на одном конкретном объекте, вы должны указать member действие:

resources :dummy do 
    member do 
    get 'get_back' 
    end 
end 

Поскольку действие член только для одного объекта, вы будете иметь URL как /dummies/123/go_back. Это автоматически установит переменную params[:id] в ваш контроллер на 123, что позволит вам легко получить ваш объект. Кроме того, метод помощника dummy_go_back_path определен и получил один объект или идентификатор в качестве параметра для генерации правильного URL-адреса.

Это самые простые маршруты, которые вы можете иметь, но вы можете посмотреть в routing outside in из направляющих рельсов в качестве надежного источника информации.

+1

Лучший ответ, который я мог найти в Интернете. Ты жжешь! – SsouLlesS

+0

@SsouLlesS рады помочь :-) – fotanus

0

Вы просто открываете файл контроллера (в приложении/контроллерах /) и определяете там новые методы. Однако, если вы сгенерировали этот контроллер (say_controller) так, как вы написали, эти два действия уже должны быть там.

7
def hello 
    @hello = "hello" 
end 

def goodbye 
    @goodbye = "goodbye" 
end 

затем в /config/routes.rb

get 'foo/hello'  ## foo is the name of your controller 
get 'foo/goodbye' 

Не забудьте создать точку тоже: views/foo/hello.html.erb, которые могут выглядеть следующим образом:

Say <%= @hello %> 

views/foo/goodbye.html.erb, которые могут выглядеть следующим образом:

Say <%= @goodbye %> 
3

Когда вы повторяете команду generate с именем другого метода, вы можете пропустить перезапись существующего контроллера и его тестовую реализацию. Это автоматически добавит маршрут и создаст представление. После этого вы должны добавить метод вручную к контроллеру, потому что это действие не коснулось файла контроллера.


Пример:

один метод, называемый new уже был создан в контроллере, когда она была изначально создана:

$ rails generate controller Person new 
... successfully created the controller, it's route and view ... 

при попытке добавить новый метод:

$ rails generate controller Person all 
Running via Spring preloader in process 28648 
    conflict app/controllers/person_controller.rb 
Overwrite ../app/controllers/person_controller.rb? (enter "h" for help) [Ynaqdh] h 
    Y - yes, overwrite 
    n - no, do not overwrite 
    a - all, overwrite this and all others 
    q - quit, abort 
    d - diff, show the differences between the old and the new 
    h - help, show this help 
Overwrite ../app/controllers/person_controller.rb? (enter "h" for help) [Ynaqdh] n 
     skip app/controllers/person_controller.rb 
     route get 'person/all' 
     invoke erb 
     exist app/views/person 
     create app/views/person/all.html.erb 
     invoke test_unit 
    conflict test/controllers/person_controller_test.rb 
Overwrite ../test/controllers/person_controller_test.rb? (enter "h" for help) [Ynaqdh] n 
     skip test/controllers/person_controller_test.rb 
     invoke helper 
    identical app/helpers/person_helper.rb 
     invoke test_unit 
     invoke assets 
     invoke coffee 
    identical  app/assets/javascripts/person.coffee 
     invoke scss 
    identical  app/assets/stylesheets/person.scss