控制器和动作中定义的路径被忽略,Ruby on Rails

根据http://guides.rubyonrails.org/layouts_and_rendering.html

我应该能够在我的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 

但是,当我创建post失败时(将其留空或使其太长),将呈现页面’/ microposts’,即控制器不存在的主页。 当我成功创建微博时,我被重定向到配置文件路径’/ profile’,当我将render 'static_pages/profile'更改为redirect_to profile_path ,重定向工作。 为什么浏览器会忽略渲染请求并进入微博控制器主页?

此外,渲染的微博页面提供NoMethodError:

 NoMethodError in Microposts#create undefined method `name' for nil:NilClass  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' 

当重定向到配置文件时,配置文件可以自行呈现,因为在static_pages控制器中的配置文件操作中定义了@user。 @user = User.find_by_remember_token(cookies[:remember_token])

您的create方法正在尝试呈现’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否则它仍将显示在地址栏中。

我认为你误解了render作用。 它只是更改呈现的模板。 它不会导致控制器中与模板相关的任何代码(如果有的话)被执行。

堆栈跟踪显示它正在呈现您请求的文件,尽管它似乎需要定义@user ,而您似乎在创建操作中没有这样做。 将@user设置为current_user ,你应该没问题。

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