#ruby-on-rails #routing
#ruby-on-rails #маршруты
Вопрос:
У меня есть следующий код контроллера:
def create
@admin = Admin.new(params[:admin])
respond_to do |format|
if @admin.save
redirect_to(@admin, :notice => 'Admin was successfully created.')
else
render :action => "new"
end
end
end
def update
@admin = Admin.find(params[:id])
respond_to do |format|
if @admin.update_attributes(params[:admin])
redirect_to(admin_admins_path, :notice => 'Admin was successfully updated.')
else
render :action => "edit"
end
end
end
и следующие маршруты:
admin_admins GET /admin/admins(.:format) {:action=>"index", :controller=>"admin/admins"}
admin_admins POST /admin/admins(.:format) {:action=>"create", :controller=>"admin/admins"}
new_admin_admin GET /admin/admins/new(.:format) {:action=>"new", :controller=>"admin/admins"}
edit_admin_admin GET /admin/admins/:id/edit(.:format) {:action=>"edit", :controller=>"admin/admins"}
admin_admin GET /admin/admins/:id(.:format) {:action=>"show", :controller=>"admin/admins"}
admin_admin PUT /admin/admins/:id(.:format) {:action=>"update", :controller=>"admin/admins"}
admin_admin DELETE /admin/admins/:id(.:format) {:action=>"destroy", :controller=>"admin/admins"}
Теперь, помимо слегка странного именования — перенаправления всегда приводят к неприемлемому 406. Что может быть не так?
Ответ №1:
Удалите respond_to do |format|
блоки. Потому что вы не указываете, в каком формате вы отвечаете, например, format.html { #your code here }
. Проверьте документацию response_to, как правильно его использовать.
Ответ №2:
У меня была похожая ошибка, мой контроллер отвечал только на JSON. Мне нужно было, чтобы он отвечал на HTML также для работы тестов (что имеет смысл только):
class AdsController < ApplicationController
respond_to :json, :html
Я получил ошибку при попытке выполнить: assert_redirected_to ad_url(ad)
Комментарии:
1. Это устранит проблему, только если вы используете в сочетании с
respond_with @obj
. В противном случае указаниеrespond_to
в контроллере является noop.2. @maletor, неверно. ошибки 406 генерируются независимо от того,
respond_with
используется или нет.
Ответ №3:
У меня возникла эта проблема после развертывания в рабочей среде, даже несмотря на то, что в процессе разработки все работало нормально.
Примерно через 15 минут потерянного времени я, наконец, обнаружил, что я забыл зафиксировать некоторые файлы просмотра (например, index.html.erb).
Использование tail -f log/production.log
на сервере выявило: FATAL -- : ActionController::UnknownFormat (SomeController#index is missing a template for this request format and variant.
При разработке ошибки не произошло, потому что, очевидно, присутствовал файл просмотра.