Добавление новой записи с самостоятельным объединением в Rails - PullRequest
2 голосов
/ 06 декабря 2010

Я сам присоединяюсь к объекту "вещь"

class Thing < ActiveRecord::Base  
    has_many :children, :class_name => "Thing", :foreign_key => "parent_id"  
    belongs_to :parent, :class_name => "Thing"    
end

Когда я просматриваю Thing, я хочу предоставить ссылку на новую страницу вещи, чтобы создать дочерний объект с parent_id, заполненным идентификатором текущего Thing, поэтому я подумал, что буду использовать это

<%= link_to 'New child thing', new_thing_path(@thing) %>

, но это не работает, поскольку действие по умолчанию относится к методу GET в контроллере, который не может найти: id в параметрах с

@thing = Thing.find(params[:id])

так что вопрос;

а) должен ли я иметь новый контроллер для детей или;
б) есть ли лучший способ отправить параметр parent_id через метод GET в контроллере Thing

Заранее спасибо

Heath.

Ответы [ 3 ]

4 голосов
/ 06 декабря 2010

Вам не нужно создавать новый контроллер для этой цели. Вы также можете сделать это с некоторыми дополнительными маршрутами и действиями в вашем существующем контроллере. Если у вас уже есть контроллер Thing, сопоставленный как ресурс, вы можете добавить дополнительные маршруты, например:

map.resources :things, :member => { :new_child => :get, :create_child => :post }

, который даст вам два дополнительных маршрута:

new_child_thing     GET   /things/:id/new_child(.:format)
create_child_thing  POST  /things/:id/create_child(.:format)

Затем вы можете добавить эти два действия в свой контроллер и обработать создание в них

def new_child
  @parent_thing = Thing.find(params[:thing_id])
  @thing = Thing.new
  ...
end

def create_child
  @parent_thing = Thing.find(params[:thing_id])
  @thing = Thing.new(params[:thing])
  @thing.parent = @parent_thing
  if @thing.save
    render :action => :show
  else
    render :action => :new_child
  end
end
0 голосов
/ 06 декабря 2010
<%= link_to 'New linked thing', new_thing_path(:Parent_id=>@thing.id) %>

и в контроллере

def new
    @parent = Thing.find(params[:Parent_id])
    @thing = Thing.new
    @thing.parent_id = @parent.id
    respond_to do |format|
       format.html # new.html.erb
       format.xml  { render :xml => @organizr }
    end
 end

Думаю, мой настоящий вопрос должен был состоять в том, как добавить параметры в GET в Rails!

0 голосов
/ 06 декабря 2010

new_thing_path(:parent_id => @thing.id)

А в новом действии:

parent = Thing.find params[:parent_id]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...