2012-04-12 88 views
1

根据http://guides.rubyonrails.org/layouts_and_rendering.html路径越来越忽视,Ruby on Rails的

我应该能够从不同的控制器定义路径,因为我已经在我创造的动作在我micropostscontroller完成:

def create 
     @micropost = current_user.microposts.build(params[:micropost]) 
     if @micropost.save 
     flash[:success] = "Micropost created!" 
     redirect_to profile_path 
     else 
     render 'static_pages/profile' 
     end 
    end 

但是,如果我没有成功创建帖子,请将页面'/ microposts'渲染为控制器不存在的主页(留空或使其太长)。当我成功创建微博时,我被重定向到配置文件路径“/ profile”,并且当我将render 'static_pages/profile'更改为redirect_to profile_path时,重定向就起作用。为什么浏览器忽略渲染请求并将微控制器控制器置于家中?

此外,所呈现的微观柱页面给出了一个NoMethodError:

NoMethodError in Microposts#create 

undefined method `name' for nil:NilClass 

<% provide(:title, @user.name) %> 

app/views/static_pages/profile.html.erb:16:in `_app_views_static_pages_profile_html_erb___1610169404003779010_70327969935820' 
app/controllers/microposts_controller.rb:10:in `create' 

时,当重定向到,如@user是在static_pages控制器配置文件操作中定义的轮廓呈现自身的罚款。 @user = User.find_by_remember_token(cookies[:remember_token])

回答

3

您的创建方法正在尝试渲染'app/views/static_pages/profile.html.erb',但您还没有给它@ @user来渲染。如果您修改代码这样它应该工作:

def create 
    @micropost = current_user.microposts.build(params[:micropost]) 
    if @micropost.save 
    flash[:success] = "Micropost created!" 
    redirect_to profile_path 
    else 
    @user = current_user # Add this line! 
    render 'static_pages/profile' 
    end 
end 

注意,microposts#create方法的路径是/microposts,所以仍然会在地址栏中显示,除非您使用redirect_to,而不是render

+1

为什么不只是'@user = current_user'? – 2012-04-12 17:38:38

+0

编辑以反映您的建议!我只是借用了他在他的static_pages控制器中使用的片段。 – niiru 2012-04-12 17:41:09

+0

由于某些原因,我仍然无法获得显示的错误消息,我希望我想我需要渲染,但似乎渲染不是解决方案。 – Laser 2012-04-12 19:16:00

0

我认为你误解了render的功能。它只是改变呈现哪个模板。它不会导致与该模板相关的任何代码(如果有的话)被执行。

堆栈跟踪表明,它呈现您所要求的文件,但它似乎预计@user被定义,你似乎并不在你创建行动做。设置@usercurrent_user,你应该没问题。

重定向可能是一个更好的选择,但如果用户刷新页面,它可能会重新提交表单数据,而重定向不会发生。