2014-09-11 87 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])