保存后Rails不会重定向到对象

时间:2013-09-10 14:20:54

标签: ruby-on-rails

保存我们的Video对象时,我们在尝试重定向到视频#watch动作并查看对象时遇到no method vide_url错误

管理/视频/控制器

def create
  @video = Video.create(user: User.first, title: params['title'], description: params['description'], file: params['video']['file'])
redirect_to @video
end

视频/控制器

def index
  @videos = Video.page(params[:page]||1)
end
def watch
  @video = Video.find_by!(id: params[:id])
end

路线

get "video/index"
get "video/watch/:id" => 'video#watch'
namespace :admin do
  resources :video
  resources :playlist
end

知道发生了什么事吗?是因为我们正在为视频使用自定义路线吗?

2 个答案:

答案 0 :(得分:4)

是的,这是您的自定义路线。 redirect_to @video基本上会调用url_for @video。来自url_for的文档:

  

依赖命名路线

     

传递记录(如Active Record)而不是散列   options参数将触发该记录的命名路由。该   查找将在类的名称上进行。所以通过一个研讨会   object将尝试使用workshop_path路由。如果你有   嵌套路由,例如admin_workshop_path,你必须调用它   显式(url_for不可能猜出那条路线)。

所以,因为你有一个围绕该资源的命名空间,你需要做:

redirect_to admin_video_path(@video)

redirect_to admin_video_url(@video)

<强>更新

如果您想重定向到监视操作,则需要重定向到包含该操作的选项哈希:

redirect_to controller: :video, action: :watch, id: @video.id

或者在routes.rb中为您的手表路线命名:

get "video/watch/:id", to: 'video#watch', as: :watch_video

并重定向到该指定路线:

redirect_to watch_video_url(@video)

答案 1 :(得分:1)

请尝试以下方法。

def create
  @video = Video.create(user: User.first, title: params['title'], description: params['description'], file: params['video']['file'])
  redirect_to admin_video_path(@video)
end