ruby-on-rails 如何在Rails中将对象值放在url中?

ogsagwnx  于 2023-10-21  发布在  Ruby
关注(0)|答案(1)|浏览(130)

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

#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。

efzxgjgh

efzxgjgh1#

快捷方式:

更改此行:

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| %>

您可以查看文档以了解更多信息。

更好的方法:

您可能需要重构路由和控制器。当您的控制器覆盖一个资源时,这是一个很好的做法。在你的情况下,你似乎需要至少两个控制器:FreelancersControllerVideosControllervideos资源应该嵌套在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.路由变得更容易理解和支持
1.每个控制器只负责一个资源
1.你得到了一堆路径和URL助手,而无需额外的工作
1.您的应用程序遵循以下约定
当然,如果您需要定制应用程序URL,Rails为您提供了方法,但在大多数情况下,遵循约定更好。
您可以在文档中找到更多信息。

相关问题