【问题标题】:Which solution for nested routes and form_for?嵌套路由和 form_for 的解决方案是什么?
【发布时间】:2013-08-14 11:57:25
【问题描述】:

在我的 Rails 项目中,为了缩短资源的 url,我在 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'

但我知道已经更改了控制器的路由,所以我将 url: 添加到 form_for
但我需要为不同的新操作或编辑明确定义不同的网址:

- 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 用于不同的操作。

问题是:对于这种路线,这是拥有工作表格的正确方法吗?
谢谢大家。
乔治

【问题讨论】:

    标签: ruby-on-rails resources routes nested form-for


    【解决方案1】:

    你应该根据模型的名称来定义资源,因为Rails会根据form_for中的对象来猜测路由名称,或者你可以手动指定url。

    路线:

    resources :users do
        resources :data_defaults
    end
    

    如果您希望 url 看起来像 /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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多