我正在使用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)
随意向我索要任何其他代码段。
答案 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模型中使用需要存在名称和头像的验证。