1

根据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

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

此外,渲染的微博页面给出了 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])

4

2 回答 2

3

您的 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_torender

于 2012-04-12T16:55:49.103 回答
0

我想你误解了什么render。它只是改变渲染的模板。它不会导致控制器中与模板(如果有)相关的任何代码被执行。

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

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

于 2012-04-12T16:57:55.860 回答