Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何管理嵌套资源和非嵌套资源_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

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.
我想管理发布者列表和问题列表中的问题

例如:

  • 在发布者列表中,用户可以单击每个发布者附近的“问题”链接。然后他进入问题列表,但只对合适的出版商进行筛选。他可以点击“创建新问题”并进入表格添加新问题。在这个表单上,我不需要向他显示选择发布者的选择列表

  • 在问题列表中,用户可以单击“创建新问题”并转到表单,但这次他应该从选择中选择发布者,这将与创建的问题相关

简单地说,我需要crud的行动问题单独和出版商的问题

首先,我试着做一个:

  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}