为什么 Rails 在保存失败后跳过我的视图循环?

问题描述

我有一个表格,可以创建一个新护士,下面是一个链接列表,这些链接是从现有护士创建的。该列表在第一次加载时呈现良好,但在表单保存失败后,我收到一条错误消息,表明我缺少链接的nurse_id 部分:

没有路由匹配 {:action=>"update",:controller=>"connect_rankings",:first=>"Wada",:holiday_schedule_id=>6,:id=>nil,:last=>"Lotta" },可能的不匹配约束:[:id]

这是创建链接列表的代码

<ul>
    <% @nurses.each do |nurse| %>
        <li>
        <%= link_to "#{nurse.first} #{nurse.last}",holiday_schedule_connect_ranking_path(@holiday_schedule.id,nurse.id,first: @nurse.first,last: @nurse.last),method: :patch %>
        </li>
    <% end %>
</ul>

这段代码在重新渲染时确实有效,所以我认为它一定与循环有关:

<ul>
    <% nurse = @nurses.first %>
        <li>
        <%= link_to "#{nurse.first} #{nurse.last}",method: :patch %>
        </li>
  
</ul>

以防万一,这里是相关的控制器操作。

def new
    @holiday_schedule = HolidaySchedule.find(params[:holiday_schedule_id])
    @nurses = @holiday_schedule.shift.nurses
    @nurse = Nurse.new(first: params[:first],last: params[:last])
  end

  def create
    @holiday_schedule = HolidaySchedule.find(params[:holiday_schedule_id])
    @shift = @holiday_schedule.shift
    @nurses = @shift.nurses
    @nurse = @shift.nurses.build(nurse_params)
    
    respond_to do |format|
      if @nurse.save
        @disconnected_rankings = @holiday_schedule.rankings.where('first = ? AND last = ?',@nurse.first,@nurse.last)
        @nurse.connect_rankings(@disconnected_rankings);

        format.html { redirect_to shift_path(@shift),notice: 'Set of rankings resolved.' }
        format.json { redirect_to shift_path(@shift),notice: 'Set of rankings resolved.' }
      else
        format.html { render :new }
        format.json { redirect_back fallback_location: root_path,notice: "Nurse Couldn't be saved." }
      end
    end
  end

任何帮助将不胜感激。

解决方法

尽管护士构建在创建中失败,但它仍然是护士集合的可迭代部分。当循环尝试将构建转换为链接时,会发生错误,因为未保存的护士对象没有 id。 解决方案是检查循环中的持久性:

<ul>
  <% @nurses.each do |nurse| %>
    <% if nurse.persisted? %>
      <li>
      <%= link_to "#{nurse.first} #{nurse.last}",holiday_schedule_connect_ranking_path(params[:holiday_schedule_id],nurse.id,first: @nurse.first,last: @nurse.last),method: :patch %>
      </li>
    <% end %>
  <% end %>
</ul>