Rails 创建 302 错误
Rails Create 302 Error
我正在开发一个玩具网络应用程序以在 Rails 上练习 Ruby,但我 运行 遇到了一个我无法解决的问题文档。本质上,我有一个表单来创建任务并将它们与用户相关联,但是表单在提交时发出 302 错误并且没有保存记录。
我有两个模型,用户和任务
用户
class User < ApplicationRecord
has_many :tasks
end
任务
class Task < ApplicationRecord
belongs_to :article
end
思路很简单,一个用户可以有很多任务。这些迁移工作正常。
我已经创建了一个用于创建任务的(部分)表格:
_compact_form.html.erb
<%= form_for( [@currentUser, @currentUser.tasks.build] ) do |f| %>
<p>
<%= f.label :label %>
<%= f.text_field :label %>
<%= f.label :complete %>
<%= f.check_box :complete%>
<%= f.submit %>
</p>
<% end %>
并且它附加到仪表板视图,该视图很简单地连接到仪表板控制器:
class DashboardController < ApplicationController
def index
@currentUser = User.find(1)
end
end
到目前为止一切都非常简单。到目前为止,我的任务控制器有一些管理创建的方法。
任务控制器:
class TasksController < ApplicationController
def new
end
def show
@user = User.find( params[:user_id] )
end
def create
@user = User.find( params[:user_id] )
@task = @user.tasks.create( task_params )
redirect_to '/'
end
private
def task_params
params.require(:task).permit(:label, :complete)
end
end
现在我们到了让我感到困惑的地步。我已经手动将一个任务插入到我的数据库中并且我能够很好地检索它,但由于某种原因,我的创建路由给出了 HTTP 302 错误。我已经像这样设置了我的路线:
resources :users do
resource :tasks
end
root 'dashboard#index'
get 'dashboard/index'
和 rake 路由输出
Prefix Verb URI Pattern Controller#Action
new_user_tasks GET /users/:user_id/tasks/new(.:format) tasks#new
edit_user_tasks GET /users/:user_id/tasks/edit(.:format) tasks#edit
user_tasks GET /users/:user_id/tasks(.:format) tasks#show
PATCH /users/:user_id/tasks(.:format) tasks#update
PUT /users/:user_id/tasks(.:format) tasks#update
DELETE /users/:user_id/tasks(.:format) tasks#destroy
POST /users/:user_id/tasks(.:format) tasks#create
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
root GET / dashboard#index
dashboard_index GET /dashboard/index(.:format) dashboard#index
所以创建路由似乎在那里,而且似乎是正确的。
现在是最奇怪的部分!如果我使用我的表单,这就是我在控制台中看到的:
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
(0.1ms) begin transaction
(0.1ms) commit transaction
这似乎是我的 tasks#create 方法中的正确代码,所以我很困惑数据的去向。任何人都可以阐明下一步的调试步骤吗?我花了一些时间创建不同的表单并完成 this 指南中的示例,但我似乎在某些地方犯了一个错误,但我找不到它。
你应该在 respond_to
块中声明你的重定向,没有格式声明的重定向会导致 302 状态响应,因为它不知道为重定向提供哪种响应,所以它假设你的客户端会处理location
header 与响应一起出现的字段,您应该这样做:
respond_to do |format|
format.html { redirect_to '/' }
end
302 状态不是错误,它是重定向的指示,重定向的位置正在作为 HTTP header 发送。至于模型没有被保存,你应该提供更好的日志结果,它可能是大量的问题,比如未经许可的参数、验证、数据库错误...
我正在开发一个玩具网络应用程序以在 Rails 上练习 Ruby,但我 运行 遇到了一个我无法解决的问题文档。本质上,我有一个表单来创建任务并将它们与用户相关联,但是表单在提交时发出 302 错误并且没有保存记录。
我有两个模型,用户和任务 用户
class User < ApplicationRecord
has_many :tasks
end
任务
class Task < ApplicationRecord
belongs_to :article
end
思路很简单,一个用户可以有很多任务。这些迁移工作正常。
我已经创建了一个用于创建任务的(部分)表格:
_compact_form.html.erb
<%= form_for( [@currentUser, @currentUser.tasks.build] ) do |f| %>
<p>
<%= f.label :label %>
<%= f.text_field :label %>
<%= f.label :complete %>
<%= f.check_box :complete%>
<%= f.submit %>
</p>
<% end %>
并且它附加到仪表板视图,该视图很简单地连接到仪表板控制器:
class DashboardController < ApplicationController
def index
@currentUser = User.find(1)
end
end
到目前为止一切都非常简单。到目前为止,我的任务控制器有一些管理创建的方法。
任务控制器:
class TasksController < ApplicationController
def new
end
def show
@user = User.find( params[:user_id] )
end
def create
@user = User.find( params[:user_id] )
@task = @user.tasks.create( task_params )
redirect_to '/'
end
private
def task_params
params.require(:task).permit(:label, :complete)
end
end
现在我们到了让我感到困惑的地步。我已经手动将一个任务插入到我的数据库中并且我能够很好地检索它,但由于某种原因,我的创建路由给出了 HTTP 302 错误。我已经像这样设置了我的路线:
resources :users do
resource :tasks
end
root 'dashboard#index'
get 'dashboard/index'
和 rake 路由输出
Prefix Verb URI Pattern Controller#Action
new_user_tasks GET /users/:user_id/tasks/new(.:format) tasks#new
edit_user_tasks GET /users/:user_id/tasks/edit(.:format) tasks#edit
user_tasks GET /users/:user_id/tasks(.:format) tasks#show
PATCH /users/:user_id/tasks(.:format) tasks#update
PUT /users/:user_id/tasks(.:format) tasks#update
DELETE /users/:user_id/tasks(.:format) tasks#destroy
POST /users/:user_id/tasks(.:format) tasks#create
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
root GET / dashboard#index
dashboard_index GET /dashboard/index(.:format) dashboard#index
所以创建路由似乎在那里,而且似乎是正确的。
现在是最奇怪的部分!如果我使用我的表单,这就是我在控制台中看到的:
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
(0.1ms) begin transaction
(0.1ms) commit transaction
这似乎是我的 tasks#create 方法中的正确代码,所以我很困惑数据的去向。任何人都可以阐明下一步的调试步骤吗?我花了一些时间创建不同的表单并完成 this 指南中的示例,但我似乎在某些地方犯了一个错误,但我找不到它。
你应该在 respond_to
块中声明你的重定向,没有格式声明的重定向会导致 302 状态响应,因为它不知道为重定向提供哪种响应,所以它假设你的客户端会处理location
header 与响应一起出现的字段,您应该这样做:
respond_to do |format|
format.html { redirect_to '/' }
end
302 状态不是错误,它是重定向的指示,重定向的位置正在作为 HTTP header 发送。至于模型没有被保存,你应该提供更好的日志结果,它可能是大量的问题,比如未经许可的参数、验证、数据库错误...