无法处理 POST 在控制器中创建操作的请求

Unable to process POST request for create action in controller

我正在使用 paperclip-5.0.0,Rails5.0.2.This 是我在控制器中的代码

class PawsController < ApplicationController
before_action :set_paw, only: [:show, :edit]
 def index
   @paws = Paw.all
 end

 def show
 end

 def new
  @paw = Paw.new
 end

def edit
end

def create
 @paw = Paw.new(paw_params)
 respond_to do |format|
  if @paw.save
    format.html { redirect_to @paw, notice: 'Paw was successfully created.' }
    format.json { render :show, status: :created, location: @paw }

  else
    format.html { render :new }
    format.json { render json: @paw.errors, status: :unprocessable_entity }
  end
 end
end


private
# Use callbacks to share common setup or constraints between actions.
def set_paw
  @paw = Paw.find(params[:id])
end


 def paw_params
   params.require(:paw).permit(:avatar,:name) if params[:avatar]
 end
end

此处的头像是用于存储 images.In 模型的爪子的列我已经添加了回形针所需的验证和名称存在的验证。

问题:rails 控制台 我可以成功地从我的计算机打开图像文件并将其添加到爪子模型,即 @paw.save returns 在控制台中为真,但在浏览器中它将我重定向到 new_paw_url 并出现两个错误。 名称不能为空。头像不能为空 process.I 之间没有抛出异常或错误,我不知道该如何解决。

ActiveRecord::SchemaMigration Load (0.2ms)  SELECT  "schema_migrations".* FROM "schema_migrations"
Processing by PawsController#create as HTML
Parameters:  {"utf8"=>"✓","authenticity_token"=>"zKpb2XFEG4FqX3aVQx9oyyGI9x2NpmF+lmt4eZy/3p3VZr2eWYvHLaEjS5AvisJ6iEbRm61SJkJSuTpMx4c0JA==", "paw"=>{"name"=>"Sheru", "gender"=>"Male", "breed"=>"", "dob"=>"", "avatar"=>#<ActionDispatch::Http::UploadedFile:0x005608576e1f30 @tempfile=#<Tempfile:/tmp/RackMultipart20170323-14343-1o95nqx.jpg>, @original_filename="art.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"paw[avatar]\"; filename=\"art.jpg\"\r\nContent-Type: image/jpeg\r\n">}, "commit"=>"Upload"}
 (0.1ms)  begin transaction
 (0.1ms)  rollback transaction
 (0.1ms)  begin transaction
 (0.1ms)  rollback transaction
 Rendering paws/new.html.erb within layouts/application
 Rendered paws/_form.html.erb (15.8ms)
 Rendered paws/new.html.erb within layouts/application (17.3ms)
 Rendered layouts/_navbar.html.erb (0.6ms)
 Completed 200 OK in 326ms (Views: 287.5ms | ActiveRecord: 2.0ms)

随时向我索取任何其他代码片段。

您的 paw_params 方法破坏了它。删除 if 语句,它应该可以工作。您遇到的问题是您通过控制器接收的参数嵌套在 params[paw] 散列中,而不是 params 散列中。你的 paw_params if 语句应该是

params.require(:paw).permit(:avatar,:name) if params[:paw][:avatar]

查看参数散列的控制台,您会发现 Rails 会将通过表单助手提交的所有参数嵌套在对象的 class 名称中。在这种情况下是爪子。

"paw"=>{"name"=>"Sheru", "gender"=>"Male", "breed"=>"", "dob"=>"", "avatar"=>#<ActionDispatch::Http::UploadedFile:0x005608576e1f30

更明显:

params[:name] #nil

params[:paw][:name] #"Sheru"

此外,根据某些属性的存在为 strong_paramaters 添加条件不是一个好的做法。如果有人提交没有头像的名字,由于 strong_parameters 原因,该名字将不会被允许,但会给用户带来糟糕的反馈。相反,您应该在 Paw 模型中使用验证,该验证需要同时存在名称和头像。