在控制器中渲染视图后,nil的NoMethodError

时间:2017-12-13 17:52:47

标签: ruby-on-rails ruby ruby-on-rails-3

所以我在我看来_form.erb:

<div class="form-group">
    <%= f.label :start_hour %><br>
    <%= f.select :start_hour, @select_hours.map {|value| [value, value]} %>
</div>

这是在edit.erb:

<%= render 'form' %>

这在我的控制器中

    def edit
        @user = current_user
        @employee = @user.employee
        @hour = @employee.working_hours.find(params[:id])
        @select_hours = Array.new
        for i in 0..12
          @select_hours.push("#{07+i}:00")
          @select_hours.push("#{07+i}:30")
        end
    end

然后我的控制器中的更新

def update
    @employee = current_user.employee
    @hour = @employee.working_hours.find(params[:id])
    if @hour.update(working_hour_params)
      redirect_to employee_working_hours_path(@employee)
    else
      render :edit
    end
end

这就是我的问题:

当我点击更新并且错误start_hour时(自定义验证,在创建未编辑时有效),因此@hour将不会更新。它再次呈现此视图但错误地表明map没有方法nil(因此对于@select_hours)。

那么我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:1)

您可以在控制器中使用回调并为这两个操作设置@select_hours,这样如果更新失败,则会显示该值,但您不必将变量分配两次,像:

before_action :set_select_hours, only: %i[edit update]
before_action :set_employee,     only: %i[edit update]
before_action :set_hour,         only: %i[edit update]

def edit; end

def update
  if @hour.update(working_hour_params)
    redirect_to employee_working_hours_path(@employee)
  else
    render :edit
  end
end

private

def set_select_hours
  @select_hours = (0..12).flat_map do |index|
    ["#{07 + index}:00", "#{07 + index}:30"]
  end
end

def set_employee
  @employee = current_user.employee
end

def set_hour
  @hour = @employee.working_hours.find(params[:id])
end

我认为@employee也可以在回调之前设置。

我已经添加了平面地图来创建并填充从该范围开始的数组,它是&#34;相同的&#34;和以前一样,只是你不需要初始化数组,使用for循环,并为它推送内容。