在Rails中添加带有自联接的新记录

时间:2010-12-06 09:18:11

标签: ruby-on-rails

我有一个自我加入对象“事物”

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的id,所以我想我会用这个

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

但是这不起作用,因为默认操作是控制器中的GET方法,它无法在参数中找到:id

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

所以问题是;

a)我是否应该为儿童设置新的控制器;或 b)有没有更好的方法将parent_id的参数发送到Thing控制器中的GET方法

提前致谢

思。

3 个答案:

答案 0 :(得分:4)

您不必为此目的创建新的Controller。您也可以使用现有Controller中的一些其他路径和操作来执行此操作。如果您已将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

答案 1 :(得分:0)

new_thing_path(:parent_id => @thing.id)

在新动作中:

parent = Thing.find params[:parent_id]

答案 2 :(得分:0)

<%= 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

我想我的真正问题应该是如何在Rails中为GET添加参数!