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 发送。至于模型没有被保存,你应该提供更好的日志结果,它可能是大量的问题,比如未经许可的参数、验证、数据库错误...