【问题标题】:Rails - Can I Show Different Partials in a View After an Error?Rails - 错误后我可以在视图中显示不同的部分吗?
【发布时间】:2025-12-28 07:15:06
【问题描述】:

我有一个 Rails 5 应用程序,它有一个基于参数显示不同表单的视图。视图首次显示时显示正确的形式

但是,当出现错误时,它总是显示相同的部分。

日记控制器

def edit
  @view = params[:view]
end

def update
  respond_to do |format|
    if @diary.update(diary_params)
      format.html { redirect_to @diary, notice: 'Diary was successfully updated.' }
      format.json { render :show, status: :ok, location: @diary }
    else
      format.html { render :edit }
      format.json { render json: @diary.errors, status: :unprocessable_entity }
    end
  end
end

edit.html.erb

<% if @view == 'close' %>
  <%= render 'close_fields'%>
<% elsif @view == 'new'%>
  <%= render 'new_fields' %>
<% else %>
  <%= render 'all_fields' %>
<% end %>

目前,当出现错误时,它总是显示'all_fields' 部分。

是否可以在保留用户在字段中输入的数据的同时显示最初显示的部分,以及错误消息(目前显示在文本字段下,因为我使用的是 simple_form)?

------------更新------------

当我在:edit 中添加puts params[:view] 时,它会在控制台中返回close

当我在:update 中添加puts params[:view] 时,它不会在控制台中返回任何内容。我还尝试将@view = "close" 更新。当我这样做时,出现错误后会显示正确的视图。

Parameters: {"utf8"=>"✓", "authenticity_token"=>"f7JoOucLkUlOyt31NW9HaJIWyXKVSu7q91kspfZYjgdF3hJneRKapnCPtgJn+R5NOC5nDhNvkB8PzzHNs9aLkg==", "diary"=>{"last_date"=>"", "notes"=>"hi, hi!", "update_type"=>"close", "view"=>"close"}, "reason_list_select2"=>"going on vacation", "season_reason_list_select2"=>"", "temp_reason_list_select2"=>"", "area"=>[{"id"=>"4", "action"=>"Not Applicable"}], "commit"=>"Close Diary", "id"=>"27"}

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    在您的update 操作中,您从未设置@view,因此始终为nil,在这种情况下您的if... elsif... else 语句始终解析为&lt;%= render 'all_fields' %&gt;

    如果您希望edit.html.erb 中的if 语句解析为else 以外的其他内容,请在update 操作中设置@view 变量。

    根据您对问题的更新,现在的问题是 :view 嵌套在 :diary 内:

    "diary"=>{"last_date"=>"", "notes"=>"hi, hi!", "update_type"=>"close", "view"=>"close"}
    

    因此,您需要使用@view = params[:diary][:view] 而不是@view = params[:view]

    【讨论】:

    • 谢谢!我将&lt;%= f.hidden_field :view, :value =&gt; @view %&gt; 添加到我的表单中,并将@view = @diary.view 添加到update 操作中,但它仍然呈现所有字段。我想知道是否需要更改format.html { render :edit }?谢谢!
    • 当您针对您的问题点击edit 操作时,您能否添加您的控制台输出?特别是您的params 值?
    • 是的,当我编辑时,puts params[:view],然后在控制台中关闭显示(关闭周围没有括号)。谢谢!
    • 然后更新? (请添加到您的问题中,不要放入 cmets。)
    • 您应该真正将控制台中的实际参数放入您的问题中,而不是您的 puts params[:view] 输出。您的 hidden_field 格式错误,或者您的 view 值是嵌套的。但是,由于您既没有显示您的html 也没有显示您的params,所以很难说。
    【解决方案2】:

    在你的 diary_controller 中

    before_action :load_view, only: [:edit, :update]
    
    # Your action methods here
    
    private
    
    def load_view
      @view = params[:view]
    end  
    

    并确保在所有表单(close_fields、new_fields、all_fields)中,都有一个名为 view 的隐藏字段,其值设置为 @view。

    【讨论】:

    • 我在表单中添加了&lt;%= f.hidden_field :view, :value =&gt; @view %&gt;,并在更新操作中添加了@view = @diary.view,但它仍然呈现所有字段。
    • @yellowreign 你能用byebug看看它在渲染错误表单时得到的值是多少
    【解决方案3】:

    一旦在你的
    中尝试这样 编辑.html.erb

    <% if @view.to_s == 'close' %>
     <%= render :partial => 'close_fields'%>
    <% elsif @view.to_s == 'new'%>
     <%= render :partial => 'new_fields' %>
    <% else %>
     <%= render :partial =>'all_fields' %>
    <% end %>
    

    注意:您的部分文件名应该有如下划线:_all_fields.html.erb

    【讨论】:

      最近更新 更多