如何在Rails的url中放置对象值?

时间:2018-12-25 06:09:41

标签: ruby-on-rails

我想修改对象中的值。但是,修改后的路由无法正常工作。

#routes
root 'freelancers#index'

get 'new' => 'freelancers#new'
post 'category' => 'freelancers#category'  

get 'video' => 'freelancers#video'
get 'video/show/:id' => 'freelancers#video_show'
get 'video/new' => 'freelancers#video_new'
post 'video/create' => 'freelancers#video_create'
get 'video/:id/edit' => 'freelancers#video_edit'
patch 'video/show/:id/update' => 'freelancers#video_update'

get 'design' => 'freelancers#design' 

表单代码:

<%= form_for(@video, :html => { :multipart => true, :id => @video.id, :url => '/video/show/:id/update' }, method: :patch ) do |f| %>

我希望输出/ video / show / 3 / update 但实际输出是video.3

1 个答案:

答案 0 :(得分:1)

快速方式:

更改此行:

patch 'video/show/:id/update' => 'freelancers#video_update'

收件人:

patch 'video/show/:id/update' => 'freelancers#video_update', as: :update_video

这将在您的应用程序中将update_video_path创建为命名助手。然后您将可以使用它:

<%= form_for(@video, :html => { :multipart => true, :id => @video.id, :url => update_video_path(@video) }, method: :patch ) do |f| %>

您可以检查the documentation以获得更多信息。

正确的方法:

似乎您需要重构路由和控制器。当您的控制器覆盖一种资源时,这是一个好习惯。在您的情况下,似乎至少需要两个控制器:FreelancersControllerVideosController,并且videos资源应嵌套在freelancers内。

例如,它可能看起来像这样:

root 'freelancers#index'

resources :freelancers, only: [:index, :new] do
  collection do
    get :design
    post :category

    resources :videos, only: [:index, :new, :create, :show, :edit, :update]
  end
end

在示例中,我照原样离开了designcategory,但是这些路由可能也需要单独的控制器。

这种方法更好,因为:

  1. 路线变得更加容易理解和支持

  2. 您的控制器仅负责一个资源

  3. 一堆path and URL helpers无需其他工作即可

  4. 您的应用程序遵循约定

当然,如果您需要自定义应用程序URL,Rails会为您提供方法,但是在大多数情况下,遵循约定会更好。

您可以在the documentation中找到更多信息。