Я новичок в Rails. Извините за вопрос noob.
Я создал новый контроллер: rails new controller Say hello goodbye
Как я могу добавить новое действие, подобное "привет" и "до свидания" с этим существующим контроллером?
Я новичок в Rails. Извините за вопрос noob.
Я создал новый контроллер: rails new controller Say hello goodbye
Как я могу добавить новое действие, подобное "привет" и "до свидания" с этим существующим контроллером?
Добавить новое действие просто. Все, что вам нужно сделать, это добавить метод на ваш контроллер, например:
# 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 в качестве надежного источника информации.
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 %>
Когда вы повторяете команду 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
Вы просто открываете файл контроллера (в приложении/контроллерах/) и определяете там новые методы. Однако, если вы создали этот контроллер (say_controller) так, как вы написали, эти два действия уже должны быть там.