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

时间:2012-04-12 16:23:13

标签: ruby-on-rails ruby-on-rails-3 redirect path render

根据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时,重定向就会起作用。为什么浏览器会忽略渲染请求并进入微博控制器回家?

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

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

2 个答案:

答案 0 :(得分: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_to代替render,否则仍会显示在地址栏中。

答案 1 :(得分:0)

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

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

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