【问题标题】:No route matches, missing required keys: [:id]没有路线匹配,缺少必需的键:[:id]
【发布时间】:2018-04-04 19:21:02
【问题描述】:

我有一个模型,“asignacion”,当创建一个对象时,如果它没有通过验证,我希望表单像往常一样再次显示错误列表。

def create
    @asignacion = AsignacionDiet.new(asignacion_params)
    if @asignacion.save
      UserMailer.aviso_dieta_asignada(@asignacion.user.email, @asignacion.diet).deliver_now

      flash[:success] = t(:dieta_asignada)
      redirect_to alumnos_path
    else
      @diets = current_user.dietas_visibles
      @diets = @diets.paginate(page: params[:page], per_page: 20)
      render :new, id: @asignacion.user_id
    end
  end

问题是当@asignacion.save返回false时,也就是验证失败,“render new”不能正常工作,页面给我报错:No route matches {:action=>"new", :controller=>"asignacion_diets", :locale=>:es}, missing required keys: [:id]

我检查了@asignacion.user_id 不是零,它是一个数字

新action对应的路由是:get '/alumnos/:id/asignar_dieta' => 'asignacion_diets#new', as: "asignar_dieta"

【问题讨论】:

    标签: ruby-on-rails validation ruby-on-rails-5


    【解决方案1】:

    这一行的问题

    render :new, id: @asignacion.user_id
    

    这里 @asignacion.user_id 将返回 nil 原因是

    @asignacion = AsignacionDiet.new(asignacion_params)
    

    如果@asignacion.save 失败,则意味着@asignacion = nil

    所以在这里你只能这样做:-

    render :new
    

    recommendation => 你应该通过 user_id 在隐藏字段中使用新表单,所以在这种情况下,如果 @asignacion.save 失败,那么你可以使用 id: params[:user_id] 在新操作中进行渲染

    【讨论】:

    • asignacion.save 失败是因为它没有通过“Asignacion”的验证,而不是因为它为零。我在渲染线之前打印了 asignacion.user_id,它显示“4”
    • @JOSEMAFUEN 我不确定,但如果它的 id 问题,那么您应该使用新表单在隐藏字段中传递 user_id,以便您可以使用该用户 id 将其渲染回新操作,希望您理解,
    • @JOSEMAFUEN 在这种情况下,根据您的路线,您可以使用用户 id = params[:id] 设置隐藏字段值,因为您正在发送带有新操作路线的 id,这相当于用户 id, .你说清楚了吗?
    • @JOSEMAFUEN 即使您将在渲染之前获得 asignacion.user_id 并且在这种情况下,如果您将渲染到新操作,它将不会获得任何 id = 4 的用户,因为没有用户保存在 id = 4 的数据库中,在这种情况下,您将在查看页面以及新操作中收到更多错误,希望我对您很清楚。无论如何,如果对您有帮助,请随时接受/投票。 :)
    猜你喜欢
    • 2014-10-07
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多