Ruby on rails 如何管理嵌套资源和非嵌套资源
我想知道解决以下问题的正确方法是什么 我有两种型号:Ruby on rails 如何管理嵌套资源和非嵌套资源,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我想知道解决以下问题的正确方法是什么 我有两种型号: Publisher and Issue. Publisher has_many issues. 我想管理发布者列表和问题列表中的问题 例如: 在发布者列表中,用户可以单击每个发布者附近的“问题”链接。然后他进入问题列表,但只对合适的出版商进行筛选。他可以点击“创建新问题”并进入表格添加新问题。在这个表单上,我不需要向他显示选择发布者的选择列表 在问题列表中,用户可以单击“创建新问题”并转到表单,但这次他应该从选择中选择发布者,这将与创建的
Publisher and Issue. Publisher has_many issues.
我想管理发布者列表和问题列表中的问题
例如:
- 在发布者列表中,用户可以单击每个发布者附近的“问题”链接。然后他进入问题列表,但只对合适的出版商进行筛选。他可以点击“创建新问题”并进入表格添加新问题。在这个表单上,我不需要向他显示选择发布者的选择列表
- 在问题列表中,用户可以单击“创建新问题”并转到表单,但这次他应该从选择中选择发布者,这将与创建的问题相关
resources :issues
resources :publishers do
resources :issues
end
问题控制员:
before_filter :find_issue
def find_issue
@publisher = Publisher.find(params[:publisher_id]) if params[:publisher_id]
@issues = @publisher ? @publisher.issues : Issue
end
但我必须在我的视图和控制器中设置许多if条件
例如,如果问题是从publisher创建的,成功后,我希望重定向到publisher\u issues\u path
,而不是issue\u path
a反之亦然。所有链接都有同样的问题,比如“返回列表”和类似的问题。所以我认为代码不是很透明
现在我想知道如何使用名称空间
namespace :publishers, do
resources :issues
end
使
# app/controllers/publishers/issues_controller.rb
module Publishers
class IssuesController < ApplicationController
# actions that expect a :publisher_id param
end
end
# app/controllers/issues_controller.rb
class IssuesController < ApplicationController
# your typical actions without any publisher handling
end
#app/controllers/publisher/issues_controller.rb
模块发布者
类IssuesController<应用程序控制器
#需要:publisher\u id参数的操作
结束
结束
#app/controllers/issues_controller.rb
类IssuesController<应用程序控制器
#没有任何发布者处理的典型操作
结束
并为两个控制器操作创建单独的视图
有没有更好或更干净的方法来解决这类问题?我想让我的代码尽可能干燥。
非常感谢您的回复 路线:
resources :issues
resources :publishes do
resources :issues
end
控制器:
class IssuesController < ApplicationController
before_filter :build_issue, only: [:new, :create]
before_filter :load_issue, only: [:show, :edit, :update, :destroy]
def index
@issues = issues.page(params[:page])
end
... all other actions will have access to @issue
private
def issues
if params[:publisher_id].present?
Publisher.find(params[:publisher_id]).issues
else
Issue
end
rescue ActiveRecord::RecordNotFound
redirect_to issues_path(alert: 'Publisher not found')
end
def build_issue
@issue = issues.new(issue_params)
end
def load_issue
@issue = issues.find(params[:id])
rescue ActiveRecord::RecordNotFound
redirect_to issues_path(alert: 'Issue not found')
end
def issue_params
# whitelisted attributes goes here
end
end
redirect_to action: :index
link_to 'Issues', {action: :index}