繁体   English   中英

Rails 使用 micropost 脚手架时不呈现错误页面

[英]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 检查器中呈现为验证,它只显示表单字段。

这些是我为调试它而执行的步骤。

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

  2. 检查 config-->environments-->development.rb 文件中的以下行:

    config.consider_all_requests_local = true

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

结果是一样的。 还应该注意的是,我已经看到 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)
  1. 将以下配置添加到 config-->application.rb 并从 _form.html.rb 中删除 local: true 但 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

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

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

有关数据远程的附加信息:true

如果您的初始 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM