redirect_to(@organization)
但我希望URL显示为
/organization/organization_name
代替
/organization/primary_key_id
我该如何设置?我的组织模型中已经有一个字段“name”.
编辑:根据要求,这是我的PagesController的索引方法…
class PagesController < ApplicationController
# Should be the home page
def index
worker_id = params[:worker_id]
worker = Worker.find_by_id(worker_id)
if worker && worker.organization
redirect_to(worker.organization)
else
render :file => "#{Rails.root}/public/404", layout: false, status: 404
end
end
end
编辑:我的config / routes.rb文件
resources :organizations, :only => [:show] do
post :update_work
get :get_work
get :mine
get :poll
post :submit
get :home
get :terms_of_use
end
这是app / model / stratum_worker.rb文件
class StratumWorker < ApplicationRecord has_one :organization_worker has_one :organization, :through => :organization_worker我刚刚写了一篇文章 here,详细说明了这一点.我的大部分答案都是从那里开始的.相关的Rails文档是 here.
快速定义:
> Slug:用于标识记录的URL的一部分,在您的案例中为organization_name
>主键:数据库记录的唯一标识符.这通常是并且应该是id.
摘要
如果键入organization_path(@organization),它将自动使用URL中的id属性.要调整为使用organization_name,您需要进行2次更改:
>覆盖routes.rb文件中的路径参数.
>覆盖模型中的to_param方法
1.覆盖路线参数
目前,如果您运行rails路线,您的路线如下:
organizations GET /organizations(.:format) organizations#index
POST /organizations(.:format) organizations#create
new_organization GET /organizations/new(.:format) organizations#new
edit_organization GET /organizations/:id/edit(.:format) organizations#edit
organization GET /organizations/:id(.:format) organizations#show
PATCH /organizations/:id(.:format) organizations#update
PUT /organizations/:id(.:format) organizations#update
DELETE /organizations/:id(.:format) organizations#destroy
edit_organization和组织路径使用id作为查询组织的参数.
用它来覆盖路线参数
Rails.application.routes.draw do resources :organizations, param: :organization_name end
现在rails路由将显示您的路由如下所示:
organizations GET /organizations(.:format) organizations#index
POST /organizations(.:format) organizations#create
new_organization GET /organizations/new(.:format) organizations#new
edit_organization GET /organizations/:organization_name/edit(.:format) organizations#edit
organization GET /organizations/:organization_name(.:format) organizations#show
PATCH /organizations/:organization_name(.:format) organizations#update
PUT /organizations/:organization_name(.:format) organizations#update
DELETE /organizations/:organization_name(.:format) organizations#destroy
2.覆盖模型参数
默认情况下,organization.to_param将返回组织的ID.这需要被覆盖,通过修改模型来执行此操作:
class Organization < ApplicationRecord
def to_param
organization_name
end
end
结论&警告
您现在可以像往常一样继续使用重定向和表单,但现在使用组织名称而不是使用id的路由.
还有,祝你的采矿池好运! Lemme知道你正在挖掘哪枚硬币,我可能会加入!
此外,我没有介绍这个,因为它不是原始问题的一部分,但是,您应该确保organization_name是唯一的!您不仅应该在模式中添加唯一性约束验证:organization_name,uniqueness:true,还应该在迁移中在数据库级别强制执行它.
附录1:定制路线
当您的路线定义如下:
resources :organizations, :only => [:show] do
post 'update_work'
get 'get_work'
get 'mine'
get 'poll'
post 'submit'
get 'home'
get 'terms_of_use'
end
您的路线将如下:
organization_update_work POST /organizations/:organization_id/update_work(.:format) organizations#update_work
organization_get_work GET /organizations/:organization_id/get_work(.:format) organizations#get_work
organization_mine GET /organizations/:organization_id/mine(.:format) organizations#mine
organization_poll GET /organizations/:organization_id/poll(.:format) organizations#poll
organization_submit POST /organizations/:organization_id/submit(.:format) organizations#submit
organization_home GET /organizations/:organization_id/home(.:format) organizations#home
organization_terms_of_use GET /organizations/:organization_id/terms_of_use(.:format) organizations#terms_of_use
organization GET /organizations/:id(.:format) organizations#show
像这样改变参数:
resources :organizations, :only => [:show], param: :organization_name do
post 'update_work'
get 'get_work'
get 'mine'
get 'poll'
post 'submit'
get 'home'
get 'terms_of_use'
end
将您的路线改为
organization_update_work POST /organizations/:organization_organization_name/update_work(.:format) organizations#update_work
organization_get_work GET /organizations/:organization_organization_name/get_work(.:format) organizations#get_work
organization_mine GET /organizations/:organization_organization_name/mine(.:format) organizations#mine
organization_poll GET /organizations/:organization_organization_name/poll(.:format) organizations#poll
organization_submit POST /organizations/:organization_organization_name/submit(.:format) organizations#submit
organization_home GET /organizations/:organization_organization_name/home(.:format) organizations#home
organization_terms_of_use GET /organizations/:organization_organization_name/terms_of_use(.:format) organizations#terms_of_use
organization GET /organizations/:organization_name(.:format) organizations#show
哪个应该与您的重定向完全一致.
