在我的Rails项目中,我的目标是缩短资源的网址,我在routes.rb中创建了路径:
resources :users do
resources :datas, controller: :data_defaults
end
所以我得到了命名路径:rake routes
user_datas GET /users/:user_id/datas(.:format) data_defaults#index
POST /users/:user_id/datas(.:format) data_defaults#create
new_user_data GET /users/:user_id/datas/new(.:format) data_defaults#new
edit_user_data GET /users/:user_id/datas/:id/edit(.:format) data_defaults#edit
user_data GET /users/:user_id/datas/:id(.:format) data_defaults#show
PUT /users/:user_id/datas/:id(.:format) data_defaults#update
DELETE /users/:user_id/datas/:id(.:format) data_defaults#destroy
然后我使用部分_form.html.haml创建新的并编辑data_default记录 在DataDefault控制器中,我有新的和编辑操作:
def new
@data_default = current_user.data_defaults.new
...
end
def edit
@data_default = DataDefault.find(params[:id])
end
然后在_form部分我有动作形式:
=form_for [current_user,@data_default] do
.....
此时,当我开始获取新的或编辑DataDefault记录时,我收到错误:
undefined method `user_data_defaults_path'
但我知道已更改控制器的路径,因此我将网址添加到form_for
但是我需要明确地为不同的动作定义不同的url new或编辑为:
- uurl = action_name == "new" ? user_datas_path(current_user, @data_default) : user_data_path(current_user, @data_default)
= form_for [current_user,@data_default] do |f|
注意:user_datas_path和user_data_path用于不同的操作。
问题是:有了这种路线,是否有正确的工作方式?
谢谢所有人。
乔治
答案 0 :(得分:1)
您应该根据模型的名称定义资源,因为Rails根据form_for中的对象猜测路由名称,或者您可以手动指定URL。
路线:
resources :users do
resources :data_defaults
end
如果您希望网址看起来像/users/:user_id/datas(.:format)
,您可以:
resources :users do
resources :data_defaults, path: 'datas'
end
视图:
=form_for [current_user,@data_default] do |f|
= f.text_field :name .............
=link_to 'back', users_data_defaults_path(current_user)