[英]Rails does not render error page when using micropost scaffold
我正在关注 Rails 教程上的 Ruby,但我似乎对没有呈现所描述的错误页面的验证练习感到困惑。
使用命令后
rails generate scaffold Micropost content:text user_id:integer
在 apps-->models--micropost.rb 的 micropost model 中添加以下验证
validates :content, length: { maximum: 140 }
该应用程序应该阻止超过 140 个字符的新消息发布,并引发错误页面。 验证部分似乎成功并阻止消息保存在数据库中,但错误页面似乎没有在 Chrome 检查器中呈现为验证,它只显示表单字段。
这些是我为调试它而执行的步骤。
使用 Chrome 检查器检查页面
结果:页面似乎卡在表单和输入页面上,而不是呈现默认的 rails 错误页面,如教程中所述。
检查 config-->environments-->development.rb 文件中的以下行:
config.consider_all_requests_local = true
检查了 microposts controller 文件,该文件似乎有一个应该呈现错误页面的分支,相关代码如下所示:
def create
@micropost = Micropost.new(micropost_params)
respond_to do |format|
if @micropost.save
format.html { redirect_to @micropost, notice: 'Micropost was successfully created.' }
format.json { render :show, status: :created, location: @micropost }
else
format.html { render :new }
format.json { render json: @micropost.errors, status: :unprocessable_entity }
end
end
end
检查显示表单的 micropost 视图并验证它是否应该显示错误(如果存在)。
视图具有以下代码:
<%= form_with(model: micropost) do |form| %> <% if micropost.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(micropost.errors.count, "error") %> prohibited this micropost from being saved:</h2> <ul> <% micropost.errors.each do |error| %> <li><%= error.full_message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= form.label:content %> <%= form.text_area:content %> </div> <div class="field"> <%= form.label:user_id %> <%= form.number_field:user_id %> </div> <div class="actions"> <%= form.submit %> </div> <% end %> ```
恢复到原始代码,删除数据库并重新按照步骤验证输入正确的代码。
结果是一样的。 还应该注意的是,我已经看到 rails 显示的其他默认错误页面,这使我相信在此应用程序的开发版本中打开了错误页面。
使用 Rails 版本 6.1.3 和第 6 版 Ruby on rails 教程由 Micheal Hartl
编辑:看起来应用程序正在正确地捕获验证测试。 从@micropost.errors.full_messages
返回的错误消息应该在页面上显示。 (byebug) @micropost.errors.full_messages ["Content is too long (maximum is 140 characters)"] (byebug)
“新”视图看起来像我在原始页面中描述为表单页面的页面上显示的内容邮政。 (减去错误字符串)
<%= render 'form', micropost: @micropost %>
<%= link_to 'Back', microposts_path %>
@dakota-lee-martinez
我刚刚注意到您提到的代码格式为.html.erb 文件,由脚手架创建
<% if micropost.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(micropost.errors.count, "error") %> prohibited this micropost from being saved:</h2>
<ul>
<% micropost.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
这很奇怪,因为我们可以看到实例值 @micropost.errors.full_message 加载了错误消息。
附加信息:我刚刚在终端 window 中注意到 rails 服务器正在运行,我相信它表明它已经呈现了我们一直在谈论的两个页面。
这是 output:
Rendering layout layouts/application.html.erb
Rendering microposts/new.html.erb within layouts/application
Rendered microposts/_form.html.erb (Duration: 4.0ms | Allocations: 1769)
这是 _form.html.erb 在 Chrome 检查器元素选项卡中呈现的内容:
<h1>New Micropost</h1>
<form action="/microposts" accept-charset="UTF-8" data-remote="true" method="post"><input type="hidden" name="authenticity_token" value="54yHyZB7szu9XL3lVvPOAhTJbKC4ghs9bJ+PDNCHuk/0+nUX37J1jvrmtamMGMXDu1flt3mWORlUdkRyzLBcCw==">
<div class="field">
<label for="micropost_content">Content</label>
<textarea name="micropost[content]" id="micropost_content"></textarea>
</div>
<div class="field">
<label for="micropost_user_id">User</label>
<input type="number" name="micropost[user_id]" id="micropost_user_id">
</div>
<div class="actions">
<input type="submit" name="commit" value="Create Micropost" data-disable-with="Create Micropost">
</div>
</form>
=> Booting Puma
=> Rails 6.1.3 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.2.2 (ruby 2.6.3-p62) ("Fettisdagsbulle")
* Min threads: 5
* Max threads: 5
* Environment: development
* PID: 29318
* Listening on http://127.0.0.1:8080
* Listening on http://[::1]:8080
Use Ctrl-C to stop
Started GET "/" for 107.77.219.209 at 2021-03-08 21:23:03 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
(1.5ms) SELECT sqlite_version(*)
(0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Processing by UsersController#index as HTML
Rendering layout layouts/application.html.erb
Rendering users/index.html.erb within layouts/application
User Load (0.2ms) SELECT "users".* FROM "users"
↳ app/views/users/index.html.erb:15
Rendered users/index.html.erb within layouts/application (Duration: 11.0ms | Allocations: 4854)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 46.6ms | Allocations: 10877)
Completed 200 OK in 62ms (Views: 50.7ms | ActiveRecord: 0.7ms | Allocations: 13882)
Started GET "/" for 107.77.219.209 at 2021-03-08 21:23:05 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by UsersController#index as HTML
Rendering layout layouts/application.html.erb
Rendering users/index.html.erb within layouts/application
User Load (0.1ms) SELECT "users".* FROM "users"
↳ app/views/users/index.html.erb:15
Rendered users/index.html.erb within layouts/application (Duration: 3.5ms | Allocations: 1032)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 11.9ms | Allocations: 4114)
Completed 200 OK in 15ms (Views: 14.0ms | ActiveRecord: 0.1ms | Allocations: 4519)
Started GET "/microposts" for 107.77.219.209 at 2021-03-08 21:23:13 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by MicropostsController#index as HTML
Rendering layout layouts/application.html.erb
Rendering microposts/index.html.erb within layouts/application
Micropost Load (0.2ms) SELECT "microposts".* FROM "microposts"
↳ app/views/microposts/index.html.erb:15
Rendered microposts/index.html.erb within layouts/application (Duration: 21.4ms | Allocations: 3982)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 38.5ms | Allocations: 7064)
Completed 200 OK in 48ms (Views: 44.2ms | ActiveRecord: 2.1ms | Allocations: 8260)
Started GET "/microposts/new" for 107.77.219.209 at 2021-03-08 21:23:20 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by MicropostsController#new as HTML
Rendering layout layouts/application.html.erb
Rendering microposts/new.html.erb within layouts/application
Rendered microposts/_form.html.erb (Duration: 21.2ms | Allocations: 2927)
Rendered microposts/new.html.erb within layouts/application (Duration: 22.1ms | Allocations: 3292)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 48.1ms | Allocations: 6375)
Completed 200 OK in 53ms (Views: 50.3ms | ActiveRecord: 0.0ms | Allocations: 6922)
Started GET "/microposts/new" for 107.77.219.209 at 2021-03-08 21:23:33 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by MicropostsController#new as HTML
Rendering layout layouts/application.html.erb
Rendering microposts/new.html.erb within layouts/application
Rendered microposts/_form.html.erb (Duration: 2.9ms | Allocations: 688)
Rendered microposts/new.html.erb within layouts/application (Duration: 3.7ms | Allocations: 797)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 11.8ms | Allocations: 3876)
Completed 200 OK in 15ms (Views: 14.2ms | ActiveRecord: 0.0ms | Allocations: 4272)
Started POST "/microposts" for 107.77.219.209 at 2021-03-08 21:25:08 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by MicropostsController#create as JS
Parameters: {"authenticity_token"=>"wIc9P9SWFTRYjfPq3rvAXfXgiNchroa3JgUPWBdtl8z/1nyKhKpvCP/7hx2e0RJsas2r+hHFEArn1uLT8Tdbvg==", "micropost"=>{"content"=>"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec.", "user_id"=>"2"}, "commit"=>"Create Micropost"}
Rendering layout layouts/application.html.erb
Rendering microposts/new.html.erb within layouts/application
Rendered microposts/_form.html.erb (Duration: 4.0ms | Allocations: 1769)
Rendered microposts/new.html.erb within layouts/application (Duration: 6.6ms | Allocations: 1878)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 13.7ms | Allocations: 4895)
Completed 200 OK in 19ms (Views: 15.7ms | ActiveRecord: 0.0ms | Allocations: 6074)
Started GET "/microposts/new" for 107.77.219.209 at 2021-03-08 21:47:00 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by MicropostsController#new as HTML
Rendering layout layouts/application.html.erb
Rendering microposts/new.html.erb within layouts/application
Rendered microposts/_form.html.erb (Duration: 1.4ms | Allocations: 688)
Rendered microposts/new.html.erb within layouts/application (Duration: 3.1ms | Allocations: 797)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 10.3ms | Allocations: 3878)
Completed 200 OK in 13ms (Views: 12.7ms | Allocations: 4281)
Started POST "/microposts" for 107.77.219.209 at 2021-03-08 21:47:21 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by MicropostsController#create as JS
Parameters: {"authenticity_token"=>"54yHyZB7szu9XL3lVvPOAhTJbKC4ghs9bJ+PDNCHuk/0+nUX37J1jvrmtamMGMXDu1flt3mWORlUdkRyzLBcCw==", "micropost"=>{"content"=>"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec.", "user_id"=>"2"}, "commit"=>"Create Micropost"}
(0.1ms) SELECT sqlite_version(*)
↳ app/controllers/microposts_controller.rb:29:in `block in create'
Rendering layout layouts/application.html.erb
Rendering microposts/new.html.erb within layouts/application
Rendered microposts/_form.html.erb (Duration: 2.6ms | Allocations: 1700)
Rendered microposts/new.html.erb within layouts/application (Duration: 4.3ms | Allocations: 1809)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 10.9ms | Allocations: 4828)
Completed 200 OK in 18ms (Views: 13.7ms | ActiveRecord: 0.3ms | Allocations: 6466)
Started POST "/microposts" for 107.77.219.209 at 2021-03-08 22:02:23 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by MicropostsController#create as JS
Parameters: {"authenticity_token"=>"54yHyZB7szu9XL3lVvPOAhTJbKC4ghs9bJ+PDNCHuk/0+nUX37J1jvrmtamMGMXDu1flt3mWORlUdkRyzLBcCw==", "micropost"=>{"content"=>"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec.", "user_id"=>"2"}, "commit"=>"Create Micropost"}
(0.1ms) SELECT sqlite_version(*)
↳ app/controllers/microposts_controller.rb:29:in `block in create'
Rendering layout layouts/application.html.erb
Rendering microposts/new.html.erb within layouts/application
Rendered microposts/_form.html.erb (Duration: 4.1ms | Allocations: 1700)
Rendered microposts/new.html.erb within layouts/application (Duration: 5.8ms | Allocations: 1809)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 14.9ms | Allocations: 4826)
Completed 200 OK in 23ms (Views: 17.1ms | ActiveRecord: 0.3ms | Allocations: 6450)
Started GET "/microposts/new" for 107.77.219.209 at 2021-03-08 22:02:28 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by MicropostsController#new as HTML
Rendering layout layouts/application.html.erb
Rendering microposts/new.html.erb within layouts/application
Rendered microposts/_form.html.erb (Duration: 1.3ms | Allocations: 688)
Rendered microposts/new.html.erb within layouts/application (Duration: 3.2ms | Allocations: 797)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 11.0ms | Allocations: 3876)
Completed 200 OK in 14ms (Views: 13.4ms | ActiveRecord: 0.0ms | Allocations: 4271)
Started POST "/microposts" for 107.77.219.209 at 2021-03-08 22:02:52 +0000
Cannot render console from 107.77.219.209! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by MicropostsController#create as JS
Parameters: {"authenticity_token"=>"fTPytX67d1aEQCIJA8PCsWwgUrd8XwKjIVWzPeYojTduRQBrMXKx48P6KkXZKMlww77boL1LIIcZvHhD+h9rcw==", "micropost"=>{"content"=>"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec.", "user_id"=>"1"}, "commit"=>"Create Micropost"}
Rendering layout layouts/application.html.erb
Rendering microposts/new.html.erb within layouts/application
Rendered microposts/_form.html.erb (Duration: 4.4ms | Allocations: 1700)
Rendered microposts/new.html.erb within layouts/application (Duration: 5.9ms | Allocations: 1809)
[Webpacker] Everything's up-to-date. Nothing to do
Rendered layout layouts/application.html.erb (Duration: 12.9ms | Allocations: 4826)
Completed 200 OK in 18ms (Views: 16.4ms | ActiveRecord: 0.0ms | Allocations: 5841)
module ToyApp
class Application < Rails::Application
# Fix for errors not showing in browser
# Stack Overflow suggestion from https://stackoverflow.com/questions/66533418/rails-does-not-render-error-page-when-using-micropost-scaffold
config.action_view.form_with_generates_remote_forms = false
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 6.0
# Settings in config/environments/* take precedence over those specified here.
# Application configuration can go into files in config/initializers
# -- all .rb files in that directory are automatically loaded after loading
# the framework and any gems in your application.
end
end
在帖子的顶部,您说过您添加了这一行:
validates :content, length: { maximum: 140 }
到你的微博 controller。 你的意思是你把它添加到了Micropost
model? 如果你说的是你的意思,那就是问题所在。 验证应添加到Micropost
model。
您可能会尝试的一件事是在您创建Micropost
的正下方的 controller 中添加一个byebug
。
def create
@micropost = Micropost.new(micropost_params)
byebug
respond_to do |format|
if @micropost.save
format.html { redirect_to @micropost, notice: 'Micropost was successfully created.' }
format.json { render :show, status: :created, location: @micropost }
else
format.html { render :new }
format.json { render json: @micropost.errors, status: :unprocessable_entity }
end
end
end
当您再次运行代码时,它将停在该行。 您可以打开运行rails server
的终端并检查:
@micropost.valid?
如果你是真的,那意味着验证实际上并没有失败。 尝试检查一下,如果没有失败,请尝试
@micropost.content.length
并确保您所看到的实际上是有意义的。 让我知道那些东西是做什么的?
他们会出现在这里吗?
@micropost.errors.full_messages
当你在 byebug 中运行它? 此外,检查new
视图并确保它正确渲染了局部视图。 这很奇怪,你从生成脚手架中得到了这个。 它应该工作...
我认为您之前在谈论默认错误页面。 验证错误实际上应该显示在表单上方,与您在提交表单之前看到的视图相同。 它不是呈现的单独页面。 我想也许您是说在提交无效数据后,您已经看到验证错误在表单上方起作用? 如果是这样,您可以无视这一点。
在显示错误消息的代码中:
<ul>
<% micropost.errors.full_messages.each do |error| %>
<li><%= error %></li>
<% end %>
</ul>
</div>
现在我想起来,要么应该工作......
<form action="/microposts" accept-charset="UTF-8" data-remote="true" method="post"><input type="hidden" name="authenticity_token" value="54yHyZB7szu9XL3lVvPOAhTJbKC4ghs9bJ+PDNCHuk/0+nUX37J1jvrmtamMGMXDu1flt3mWORlUdkRyzLBcCw==">
你有data-remote="true"
那里。 我认为问题在于您之前设置的将默认提交设置为本地的配置:true。 在这种情况下,这不起作用。 我会仔细检查那部分,看看你是否能看到那里有问题。 否则,您可以将local:true
添加到表单标签:
<%= form_with(model: micropost, local: true) do |form| %>
因此,另一个 stackoverflow 帖子建议在config/application.rb
中执行此操作
config.action_view.form_with_generates_remote_forms = false
您需要在application.rb
而不是development.rb
中使用它,因为您的 forms 在开发或生产中应该以相同的方式工作。 确保在进行此更改后重新启动 rails 服务器以使其生效。
要解决此问题,配置语句:
config.action_view.form_with_generates_remote_forms = false
需要放在最后:
config/application.rb
注意:默认情况下,rails 脚手架将以下内容放在此文件的顶部,最终将反转之前插入的任何内容:
config.load_defaults 6.0
感谢@dakota-lee-martinez 提供特定于 Rails 的调试技巧,以及在以下位置查找和共享配置选项: data-remote: Stack Overflow post
如果您的初始 Gemfile 包含 rails 版本 6.0 并且您使用 6.1 更改了它,那么更改
config.load_defaults 6.0
在config/application.rb
中
config.load_defaults 6.1
也可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.