2014-09-11 112 views
0

我有以下两种方法在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”为无:NilClass`这发生在:

<%= form_for @blog, :url => user_blog_path(current_user.id, @blog.id), :html => {:class => 'form-horizontal'} do |f| %> 

我在做什么错在这里?每个教程,表单帖子或堆栈问题都表示这是如何重新呈现表单以显示任何错误。

当我在render :edit之上放置,然后复制并粘贴以使其物理呈现编辑操作时,@blog是空白的。 current_user包含当前用户,在本例中为@blog为零。

那么我做错了什么?

回答

0

您没有在您的控制器操作中设置@blog - 您正在设置blog

它需要是一个实例变量传递给视图进行渲染,就像它在编辑操作中一样。

无关,但您可以将Blog.find_by!(id: params[:id])简化为Blog.find(params[:id])