Обработка вложенного ресурса has_one в Rails 3 - PullRequest
3 голосов
/ 27 февраля 2011

У меня есть модель User и модель About.Модель about - это страница, на которой пользователи имеют больше информации о них, поэтому по своей природе более целесообразно иметь ее в отдельной модели, а не в пользовательской модели.

Я хочу иметь возможность перенаправить его на что-то вроде /: username / about и получить все глаголы, работающие на этом пути (GET POST, PUT, DELETE).

/:username/about
/:username/about/edit
/:username/about

Thisэто то, что у меня уже есть

# routes.rb
resources :users do 
  resources :abouts
end

match ':username/about' => 'abouts#show', :as => :user_about
match ':username/about/add' => 'abouts#new', :as => :user_new_about    
match ':username/about/edit' => 'abouts#edit', :as => :user_edit_about

А в моделях у меня есть

# about.rb
belongs_to :user

# user.rb
has_one :about

Когда я делаю пост или помещаю в / rose / about Это интерпретирует Это как шоу

Started POST "/roses/about" for 127.0.0.1 at Sun Feb 27 16:24:18 -0200 2011
  Processing by AboutsController#show as HTML

Возможно, мне не хватает объявления в маршрутах, но разве не беспорядочно объявлять каждый глагол для ресурса, если он отличается от значения по умолчанию?

Что самое простое и понятноеспособ заархивировать это?

Ответы [ 2 ]

11 голосов
/ 28 февраля 2011

При использовании has_one может иметь смысл объявить его в качестве единственного ресурса в ваших маршрутах.Значение

resources :users do
  resource :about # notice "resource" and not "resources"
end

И если вы хотите переопределить пути для нового / редактирования, добавьте параметр :path_names в вызов ресурса / ресурсов:

resources :about, :path_names => { :new => 'add', :edit => 'edit' }

Официальная документация содержит множество других советов и приемов для маршрутизации.

4 голосов
/ 28 февраля 2011

Вы можете использовать блоки scope и controller для сокращения словоблудия:

  scope "/:username" do
    controller :abouts do
      get 'about' => :show
      post 'about' => :create
      get 'about/add' => :new
      get 'about/edit' => :edit
    end
  end

, что дает:

     about GET /:username/about(.:format) {:action=>"show", :controller=>"abouts"}
           POST /:username/about(.:format) {:action=>"create", :controller=>"abouts"}
 about_add GET /:username/about/add(.:format) {:controller=>"abouts", :action=>"new"}
about_edit GET /:username/about/edit(.:format) {:controller=>"abouts", :action=>"edit"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...