显示has_one关联上的控制器的方法

时间:2016-03-03 18:41:17

标签: ruby-on-rails ruby-on-rails-3

我有两个型号

thing.rb
has_one :subthing

subthing.rb
belongs_to :thing

并使用

进行路由
resources :thing do
  resource :subthing
end

resources :subthing

然而,我的控制器上的show方法

def show
  @subthing = Subthing.find(params[:id])
end

当我访问时

http://example.org/things/1/subthing

给我一​​个错误

找不到没有ID的Subthing

我觉得这应该由框架来处理......也就是说应该知道相关的Subthing是属于Thing的那个。

我是否遗漏了某些东西,或者我不能在这里为Subthings使用相同的控制器方法,而当它们属于某个东西时可以使用Subthings。

或者我是否需要明确地告诉控制器每个潜在的关联。即

def show
  if params[:thing_id].present?
    @subthing = @thing.find(params[:thing_id]).subthing
  else
    @subthing = Subthing.find(params[:id])
  end
end

1 个答案:

答案 0 :(得分:1)

如果您打算对嵌套资源和顶级资源使用相同的SubthingsController,那么是的,您需要按照建议进行操作:

def show
  if params[:thing_id].present?
    @subthing = @thing.find(params[:thing_id]).subthing
  else
    @subthing = Subthing.find(params[:id])
  end
end

但是你的控制器变得非常复杂并且不值得。您最好重新定义路线或使用两个独立的控制器。