关于视频控制器的更新操作,我写了 - >
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
你们觉得怎么样?仍然是一个菜鸟,非常感谢:)
答案 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