表单中的第一个参数在渲染时不能包含nil或为空

时间:2013-12-17 10:57:01

标签: ruby-on-rails

关于视频控制器的更新操作,我写了 - >

  def update
    if current_user.video.update_attributes(video_params)
      flash[:success] = "Video App Updated!"
      redirect_to root_url
    else
      render :edit
    end
  end

然而,render:edit部分似乎抛出了一个错误。它说:

First argument in form cannot contain nil or be empty
Extracted source (around line #6):


  <div class="row">
    <div class="span6 offset3">
      <%= form_for(@video) do |f| %> # line 6

我假设我不太了解渲染正在做什么。这就是我的编辑操作的样子 - &gt;

  def edit
    @video = current_user.video
  end

你们觉得怎么样?仍然是一个菜鸟,非常感谢:)

3 个答案:

答案 0 :(得分:1)

您未在@video操作上设置update变量,因此它是nil。你应该:

def update
  @video = current_user.video
  if current_user.video.update_attributes(video_params)
    flash[:success] = "Video App Updated!"
    redirect_to root_url
  else
    render :edit
  end
end

您应该记住,在控制器中渲染其他操作的模板不会运行该操作的代码。所以,如果你有

render :edit

将呈现部分edit,但此操作的控制器代码(设置@video)将不会运行。

答案 1 :(得分:0)

render :edit行会显示edit.html.erb视图,但不会执行edit操作。 edit.html.erb期待未在@video操作中设置的update变量,这就是您遇到此错误的原因。有两种解决方案:

@video

中设置update_action变量
def update
  @video = current_user.video
  if @video.update_attributes(video_params)
    flash[:success] = "Video App Updated!"
    redirect_to root_url
  else
    render :edit
  end
end

更新失败时重定向到edit操作

def update
  if current_user.video.update_attributes(video_params)
    flash[:success] = "Video App Updated!"
    redirect_to root_url
  else
    flash[:alert] = current_user.video.errors.full_messages.join('\n')
    redirect_to :action => :edit, :id => current_user.video.id
  end
end

如果edit很复杂,第二种解决方案会更好,因为它可以避免重复。在你的情况下,第一个解决方案也很好。

render

中解释了redirect_to和{{1}}之间的差异

答案 2 :(得分:-1)

我有相同类型的条件,我这样做了。并且它在我的案例中工作

def update
  @video = current_user.video
  respond_to do |format|
    if @video.update_attributes(video_params)
      format.html { redirect_to root_url }
    else
      format.html { render :edit }
    end
  end
end