nul*_*ull 15 ruby-on-rails nested-resources
我有一个属于许多不同模型的嵌套资源.例如:
resources :users do
resources :histories, only: [:show]
end
resources :publications do
resources :histories, only: [:show]
end
resources :events do
resources :histories, only: [:show]
end
Run Code Online (Sandbox Code Playgroud)
在HistoriesController,我想找到父对象,虽然我很难想到一个干燥的方法来处理这个问题.目前,我能想到的最好的是:
if params[:user_id].present?
@parent = User.find(params[:user_id])
elsif params[:publication_id].present?
@parent = Publication.find(params[:publication_id])
elsif . . . .
Run Code Online (Sandbox Code Playgroud)
我有几十个模型,我必须以这种方式分支,这似乎很草率.我不考虑更好的(可能是烘焙的)方法吗?
小智 13
我这样做的方法是将父模型类名添加为路径中的默认参数.
对于问题示例,这应该是这样的:
resources :users, model_name: 'User' do
resources :histories, only: [:show]
end
resources :publications, model_name: 'Publication' do
resources :histories, only: [:show]
end
resources :events, model_name: 'Event' do
resources :histories, only: [:show]
end
Run Code Online (Sandbox Code Playgroud)
这将在params哈希中添加模型名称.
然后在控制器/操作中,您可以获得您的父模型,如:
params[:model_name].constantize # Gives you the model Class (eg. User)
Run Code Online (Sandbox Code Playgroud)
和外键如:
params[:model_name].foreign_key # Gives you column name (eg. user_id)
Run Code Online (Sandbox Code Playgroud)
所以你可以这样做:
parent_class = params[:model_name].constantize
parent_foreing_key = params[:model_name].foreign_key
parent_object = parent_class.find(params[parent_foreing_key])
Run Code Online (Sandbox Code Playgroud)
jvn*_*ill 12
不是真正的解决方案,但你可以逃脱
parent_klasses = %w[user publication comment]
if klass = parent_klasses.detect { |pk| params[:"#{pk}_id"].present? }
@parent = klass.camelize.constantize.find params[:"#{klass}_id"]
end
Run Code Online (Sandbox Code Playgroud)
如果您在参数名称和模型之间使用约定
| 归档时间: |
|
| 查看次数: |
3760 次 |
| 最近记录: |