Маршруты не работают

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