我在rails控制器中有以下两种方法:
def edit
@blog = Blog.find_by!(id: params[:id])
end
def update
blog = Blog.find_by!(id: params[:id])
user = User.find_by!(id: params[:user_id])
blog.update_attributes(blog_update_params)
if blog.save
flash[:success] = 'Updated Blog'
redirect_to user_blog_path(user.id, blog.id)
else
render :edit
end
end
让我们假设这个更新失败了,好吧你应该render :edit
这意味着,我认为我们应该将博客的id传递给编辑动作并重新呈现表单。这反过来会显示任何错误:
<div class="container-sm">
<%= form_for @blog, :url => user_blog_path(current_user.id, @blog.id), :html => {:class => 'form-horizontal'} do |f| %>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<h1>Edit <%= @blog.title %></h1>
<p class="text-muted">Want to change the name? Never a simpler place!</p>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-6">
<%= render :partial => 'form_errors', :object => @blog %>
</div>
</div>
<%= render :partial => 'blog_form', :locals => {:f => f} %>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<%= f.submit "Update", :class => 'btn btn-primary' %>
</div>
</div>
<% end %>
</div>
我上面的编辑表格,非常基本。很简单。每个人都很开心。如果我们仍然认为更新失败了它应该重新呈现此表单,但问题是:undefined method
id'代表nil:NilClass`发生在:
<%= form_for @blog, :url => user_blog_path(current_user.id, @blog.id), :html => {:class => 'form-horizontal'} do |f| %>
我在这里做错了什么?每个教程,表单帖子或堆栈问题都说明了这是重新呈现表单以显示任何错误的方式。
当我将binding.pry
放在render :edit
上方,然后复制并粘贴以使其物理渲染编辑操作时,@blog
是空白的。 current_user包含当前用户,在这种情况下是我,@blog
是nil。
那么我做错了什么?
答案 0 :(得分:0)
您未在控制器操作中设置@blog
- 您正在设置blog
。
它必须是一个要传递给视图进行渲染的实例变量,就像它在编辑操作中一样。
不相关,但您可以将Blog.find_by!(id: params[:id])
简化为Blog.find(params[:id])
。