#ruby-on-rails #ruby #ruby-on-rails-3
#ruby-on-rails #ruby #ruby-on-rails-3
Вопрос:
Я не знаю, по какой причине мое приложение не отвечает ни на какие запросы POST, которые не являются URL-адресом REST.
Ниже приведен мой файл routes.rb.
constraints(Subdomain) do
resources :invitations
resources :settings, :only => [:index, :create, :destroy]
scope "/settings" do
get "/departments" => "settings#departments"
get "/job_types" => "settings#job_types"
get "/industries" => "settings#industries"
get "/functional_areas" => "settings#functional_areas"
get "/managers" => "settings#managers"
get "/hrs_responsible" => "settings#hrs_responsible"
get "/welcome_text" => "settings#welcome_text"
post "/save_welcome_text" => "settings#save_welcome_text" <-------
end
end
В моем файле view у меня есть
=form_for(@setting), :url => "/settings/save_welcome_text", :method => :post do |f|
- All the form fields here.
- f.submit "Save"
Эта информация содержит сгенерированный HTML-код и соответствующий серверный журнал.
https://gist.github.com/943984
Когда я нажимаю отправить, я вижу «Ошибка маршрутизации», что такого маршрута не существует. Из журналов сервера я могу понять, что запрос отправляется как POST-запрос. Однако, если я изменю его на «match» из «post» в файле routes.rb, это сработает. Все запросы GET работают нормально. Я что-то упускаю?
Комментарии:
1. как вы думаете, почему это не работает? Покажите, как вы пытаетесь это вызвать. покажите свои ссылки
2. Ну, у меня есть «form_for (@setting), :url => «/settings/save_welcome_text», :method => :post», он выдает мне ошибку о том, что маршрута не существует.
3. Загляните в исходники и покажите мне тег «<форма>»
4. Проверьте это, gist.github.com/943984
Ответ №1:
Вы должны указать свой method
в html
блоке
=form_for(@setting), :url => "/settings/save_welcome_text", :html => { :method => :post } do |f|
Ответ №2:
Использование методов get и post в вашем routes.rb, насколько я понимаю, доступно только для маршрутов участников или коллекций внутри блока ресурсов.
Когда вы делаете это иначе, вам приходится использовать match, и если вы хотите сделать его доступным только для post, вы можете указать его следующим образом:
match "/save_welcome_text" => "settings#save_welcome_text", :via => :post
Комментарии:
1. Привет, спасибо за ответ. Я проверил ваше вышеупомянутое предложение и все еще выдает мне ошибку. Когда я использую
match "/save_welcome_text" => "settings#save_welcome_text"
, это работает. Но это соответствует всем запросам, которые я не хочу, я хочу, чтобы он принимал только POST-запрос.2. Вы уверены, что запрос действительно отправлен через post? Если вы проверяете журналы, начиная с того момента, когда у вас не было синтаксиса :via , говорит ли это, что это post? Вы изменили form_for, как предложил fl00r?