控制器和动作中定义的路径被忽略,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
,你应该没问题。
重定向可能是一个更好的选择 – 如果用户刷新页面,它可能会重新提交表单数据,而重定向则不会发生。