Rails 嵌套路线的简单形式

cod*_*nce 4 ruby-on-rails nested-routes simple-form

simple_form_for我正在尝试在 Rails 3.2 中构建一个@objects具有双重嵌套路线的 for ,例如:

/users/1/projects/2/objects
Run Code Online (Sandbox Code Playgroud)

形式为:

<%= simple_form_for @object, :url => user_project_objects_path(@user, @project), :html => { :class => 'form-horizontal' } do |f| %>
Run Code Online (Sandbox Code Playgroud)

在routes.rb中:

resources :users do
  resources :projects do
    resources :objects do
      collection { post :import }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我的问题是:控制器的new和动作是什么?createObject

到目前为止 - 我遇到了路由错误 - 我有:

def create
  @user = current_user
  @project = Project.find_by_user_id(@user)
  @object = @project.objects.build(params[:object])
  if @object.save
    flash[:notice] = "Object was successfully created"
    redirect_to user_project_objects_path
  else
    render 'new'
  end
end

def new
  @user = current_user
  @project = Project.find_by_user_id(@user)
  @object = @project.objects.build
end
Run Code Online (Sandbox Code Playgroud)

非常感谢任何建议。

回复 格雷格·W:

No route matches {:action=>"edit", :controller=>"objects", :user_id=>#<Object id: 8, source_lang_id: 1, source_content: "Kaffehaus", target_lang_id: 2, target_content: "cafe", domain_id: 2, owner_id: nil, created_at: "2013-01-04 06:36:55", updated_at: "2013-01-04 06:36:55", project_id: 2>}
Run Code Online (Sandbox Code Playgroud)

(用户owner_id,即 current_user)没有被更新 - 这可能是问题(?)

小智 5

在表格中您可以使用

simple_form_for([@user, @project, object]) do
Run Code Online (Sandbox Code Playgroud)

您可以使用关系来获取数据,例如

@project= current_user.projects
Run Code Online (Sandbox Code Playgroud)

代替

@project = Project.find_by_user_id(@user)
Run Code Online (Sandbox Code Playgroud)