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

时间:2017-03-23 15:00:28

标签: ruby-on-rails paperclip

我正在使用paperclip-5.0.0和Rails 5.0.2。这是我在控制器中的代码

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

这里的头像是用于存储图像的paw列。在模型中,我已经为回形针添加了必需的验证并验证了名称的存在。

问题: rails console 中,我成功地从计算机中打开图像文件并将其添加到爪子模型,即 @ paw.save < / strong>在控制台中返回true,但在浏览器中它将我重定向到new_paw_url,但有两个错误。     名称不能为空。和     头像不能为空。 流程之间没有异常或错误。我不知道该如何解决这个问题。

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)

随意向我索要任何其他代码段。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

更明显:

params[:name] #nil

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

此外,根据某些属性的存在,为strong_paramaters添加条件不是一个好习惯。如果有人提交没有头像的名称,由于strong_parameters,该名称将不被允许,但会给用户提供较差的反馈。相反,您应该在Paw模型中使用需要存在名称和头像的验证。