gpt4 book ai didi

ruby-on-rails - 如何在 form_with 中设置作用域参数值

转载 作者:行者123 更新时间:2023-12-05 02:55:26 25 4
gpt4 key购买 nike

我正在重构我的应用程序的路由以解决 rule of thumb因为我的路线很长。

假设我有以下模型

class Company < ApplicationRecord
has_many :projects
has_many :users
...
end

class Project < ApplicationRecord
belongs_to :company
has_many :jobs
...
end
...

我的路线看起来像

Rails.application.routes.draw do
...
resources :companies do
resources :projects do
resources :jobs
end
end
end

用户登录后,我设置了 @current_user 和他有权访问的公司 - @current_user.companies。通过这种方法,我可以避免在用户修改 URL 以访问未经授权的资源时访问数据库。例如,当用户编辑作业时:

/companies/1/projects/30/jobs/20/edit

class JobsController < ApplicationController
def edit
@project = @company.projects.find(params[:project_id])
@job = @project.jobs.find(params[:job_id])
...
end
...
end

我遵循了 guides and added scope with a prefixed named parameter 中的示例缩短一层嵌套资源。

scope ':company_id' do
resources :projects do
resources :jobs
end
end

到目前为止一切顺利,我已经成功地从

缩短了我的网址
/companies/1/projects/30/jobs/20/edit
edit_company_project_job_path(@company, @project, @job)

/1/projects/30/jobs/20/edit
edit_project_job_path(@company, @project, @job)

但是后来我破坏了我的 form_with 模型:[@company, @project, @job] 因为它无法推断带前缀的命名参数 - :compay_id,即使我指定它 @company.id

我唯一的解决办法是重新设置命名路由

scope ':company_id' as: 'company' do
resources :projects do
resources :jobs
end
end

这不是和以前一样吗?我只是缩短了 URL /1/projects/30/jobs/20/edit 但路径又回到了原来的 edit_company_project_job_path(@company, @project, @job) .我错过了什么吗?我很想知道你是怎么做到的

最佳答案

你真的完全误解了这条规则。 Jamis Buck 指的是:

/users/1/articles/1

可以缩短为:

/articles/1

您创建的是一条虚荣路线,实际上等同于:

:username/articles/1

当然 bob/arcticles 看起来很漂亮,但它有一些严重的问题。如果您让用户选择用户名并将它们放在路由的根“ namespace ”中,您将不得不处理用户名可能与应用程序的任何现有或计划路由冲突的问题。为了“漂亮的网址”真的值得吗?

:username/articles 还不如 users/:username/articles RESTful,因为您实际上丢失了一定程度的描述资源的上下文信息。 REST 是关于有意义的 URL。不是短而漂亮的 URL。

关于ruby-on-rails - 如何在 form_with 中设置作用域参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61236638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com