Подтвердить что ты не робот

Как добавить новое действие к существующему контроллеру?

Я новичок в Rails. Извините за вопрос noob.

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

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

4b9b3361

Ответ 1

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

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

Теперь, чтобы иметь возможность получить доступ к этому действию через 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, и для перехода на эту страницу URL-адрес /dummies/go_back.

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

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

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

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

Ответ 2

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 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

Ответ 4

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