无法处理 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 模型中使用验证,该验证需要同时存在名称和头像。
我正在使用 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 模型中使用验证,该验证需要同时存在名称和头像。