当我重新渲染相同的视图时,我的 Ruby on Rails 活动记录验证错误不会持续存在

My Ruby on Rails active record validation error does not persist when I re-render the same view

提问人:Tony M 提问时间:9/27/2023 最后编辑:Tony M 更新时间:9/28/2023 访问量:57

问:

我正在使用 Rails 7 和 Carrierwave 上传图像。

我的图像上传按预期工作,但是当我尝试为不正确的文件类型实施验证错误消息时,我的问题发生了。在我的 app/uploaders/user_avatar_uploader.rb 文件中,我指定只接受 jpeg、jpg 和 png 文件。

当我使用以下代码并使用 binding.pry 进行测试时(在尝试更新我的表单后),我可以看到 @user_profile 对象上有 1 个错误。

def edit
        @user_profile = UserProfile.find(params[:id])
    end

    def update
        @user_profile = UserProfile.find(params[:id])
        if @user_profile.update(user_profile_params)
            redirect_to root_path
        else
            binding.pry
        end
    end

但是,当我使用下面的代码修改更新方法并尝试在编辑视图中查看错误时,没有任何显示。为了清楚起见,我正在尝试重新呈现最初显示的相同视图(编辑),并显示错误。

def update
        @user_profile = UserProfile.find(params[:id])
        if @user_profile.update(user_profile_params)
            redirect_to root_path
        else
            render 'edit'
        end
    end

这是我包含在我的编辑视图中的代码,以尝试显示错误。我的计数为“0”,并且在提交带有无效载波上传文件类型的表单后,它没有显示任何错误消息。

<%= @user_profile.errors.count %>

    <% if @user_profile.errors.any? %>
      <h3>Some errors were found:</h3>
      <ul>
        <% @user_profile.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    <% end %>

知道会发生什么吗?我知道当我的更新控制器操作触发时会出现错误,但由于某种原因,它们没有被转移到我的“编辑”视图的渲染中。

编辑

我直接在我的视图中添加了 binding.pry,在我检查视图中是否有任何错误的代码之后。在视图中,我没有看到任何错误。但是在控制台的binding.pry中,当我检查时,我得到并可以看到错误。@user_profile.errors.any?true

<h3>Profile</h3>

<%= @user_profile.errors.count %>

<% if @user_profile.errors.any? %>
  <h3>Some errors were found:</h3>
  <ul>
    <% @user_profile.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
  </ul>
<% end %>

<% binding.pry %>
Ruby-on-Rails ActiveRecord 错误处理 载波

评论

2赞 max 9/27/2023
这个问题不可能从外面回答。我们只是没有足够完整的图片来隔离错误。您需要继续调试过程,并确保在某个位置(例如)在它到达视图之前不会重新分配。@user_profile
0赞 Tony M 9/28/2023
@max 我同意你的看法,但是在同一控制器的更新操作和呈现“编辑”视图之间,我可能在哪里重新分配?这两个步骤之间应该没有任何内容,对吧?@user_profile
1赞 smathy 9/28/2023
奇怪的是,当你添加 时,你拿出了 .您可能正在该会话中执行影响错误的事情。更改它,如果您的撬动会话显示错误,但您的视图没有显示,那么您没有向我们显示某些内容。binding.pryrender 'edit'
1赞 smathy 9/28/2023
把它放在前面,所以撬动会话的任何侧面效果也会影响视图渲染。不妨也向我们展示撬动会话,以防万一您在那里做一些奇怪的事情。
1赞 smathy 9/28/2023
对不起,我完全错过了你提到这是一个涡轮增压表单/请求。

答:

0赞 Tony M 9/28/2023 #1

我最终不得不禁用涡轮增压器才能使其正常工作。我还重写了我的 a,因为前者正在被弃用。form_forform_with

新代码:

<%= form_with(model: @user_profile, data: { turbo: false }) do |f| %>