使用微柱脚手架时,Rails 不会呈现错误页面



我正在遵循Ruby on Rails教程,但我似乎挂断了一个没有呈现所描述错误页面的验证练习。

使用命令后

rails generate scaffold Micropost content:text user_id:integer

将以下验证添加到 apps-->models--micropost.rb 上的微帖子模型中

validates :content, length: { maximum: 140 }

该应用程序应该防止大于 140 个字符的新消息发布,并抛出错误页面。 验证部分似乎成功并阻止消息保存在数据库中,但错误页面似乎没有在仅显示表单字段的Chrome检查器中呈现为已验证。

这些是我为调试此问题而执行的步骤。

  1. 使用 Chrome 检查器检查
    results:页面似乎卡在表单和输入页面上,而不是呈现默认的 rails 错误页面,如教程中所述。

  2. 已检查配置-->环境-->development.rb文件中的以下行:

    config.consider_all_requests_local = 真

  3. 已检查微帖子控制器文件,该文件似乎有一个分支,应该呈现错误页面 相关代码如下所示:

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
    检查了显示
  1. 表单的微帖子视图,并验证了它是否应该显示错误(如果存在)。
    view 具有以下代码:

    <%= 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 %>
    ```
    
  2. 恢复到原始代码,删除数据库并重新按照步骤验证输入正确的代码。

结果是一样的。 还应该注意的是,我已经看到rails显示的其他默认错误页面,这使我相信错误页面在此开发版本的应用程序中被打开。

使用 rails版本 6.1.3 和 Micheal Hartl 的 Ruby on rails 教程的第 6 版

编辑:看起来该应用程序正在正确捕获验证测试。 从@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-李-马丁内斯

我刚刚注意到您提到的代码位于由脚手架创建的form.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 加载了错误消息。

附加信息:我刚刚在终端窗口中注意到 rails 服务器正在运行,我相信它表明它已经呈现了我们一直在谈论的两个页面。

这是输出:

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)
  1. 将下面的配置添加到 config-->application.rb 并删除了 local:true 来自 _form.html.rb 但 rails 不再显示错误
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

如果您的初始 Gemfile 包含 rails 版本 6.0,并且您使用 6.1 对其进行了更改,则更改

config.load_defaults 6.0

config/application.rb

config.load_defaults 6.1

也可以正常工作。

在帖子的顶部,你说你添加了这一行:

validates :content, length: { maximum: 140 }

到您的微型邮轮控制器。您的意思是将其添加到Micropost模型中吗?如果你说了你的意思,那就是问题所在。验证应添加到Micropost模型中。

除此之外

您可以尝试的一件事是将byebug添加到控制器的正下方,您创建Micropost的位置。

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?

如果你得到 true,这意味着验证实际上并没有失败。尝试检查一下,如果它没有失败,请尝试做

@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| %>

更新到配置

因此,另一个堆栈溢出帖子建议在config/application.rb中执行此操作

config.action_view.form_with_generates_remote_forms = false

您需要它application.rb而不是development.rb因为您的表单在开发或生产中应该以相同的方式工作。请确保在进行此更改后重新启动 rails 服务器,以便它生效。

要解决此问题,config 语句

config.action_view.form_with_generates_remote_forms = false

需要放在以下位置的末尾:

config/application.rb

注意:默认情况下,rails 基架将以下内容放在此文件的顶部,最终会反转在其之前插入的任何内容:

config.load_defaults 6.0

感谢 @dakota-lee-Martinez 提供特定于 rails 的去抖动提示,以及在以下位置查找和共享配置选项: 数据远程:堆栈溢出帖子

有关数据远程的其他信息:true

最新更新