Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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 使用资源定义rails路由_Ruby On Rails - Fatal编程技术网

Ruby on rails 使用资源定义rails路由

Ruby on rails 使用资源定义rails路由,ruby-on-rails,Ruby On Rails,我刚刚开始了我的RubyonRails之旅 不确定,但是否可以用“资源”重写以下路线: get '/comments/:object_type/:object_id', to: 'comments#get_all' 当控制器处理请求时: def get_all @object_type=params[:object_type] @object_id=params[:object_id] @comments = Comment.get_all(@object_type

我刚刚开始了我的RubyonRails之旅 不确定,但是否可以用“资源”重写以下路线:

get '/comments/:object_type/:object_id', to: 'comments#get_all'
当控制器处理请求时:

  def get_all
    @object_type=params[:object_type]
    @object_id=params[:object_id]
    @comments = Comment.get_all(@object_type, @object_id)
    ...(irrelevant code)
  end

  def self.get_all(object_type, object_id)

    case object_type
    when 'task'
      Comment.select('comments.*, profiles.first_name, profiles.last_name, profiles.avatar')
          .joins(user: :profile)
          .where(task_id:object_id)
          .order(created_at: :desc)
   # TODO when 'project' and other types
    else
      raise ActiveRecord::RecordNotFound
    end
  end

它工作得很好,但是有点难看,我开始维护的项目只使用“资源”

严格遵循RESTful资源模式,您的URL会有很大不同。如果您希望改进rails,那么它可能是一个值得遵循的好模式,当然也是一个值得理解的模式

我假设“可注释”对象本身就是模型,因此您有一个models/project.rb和models/task.rb文件

用于此功能的URL,如果您将项目、任务和注释视为REST资源,将是:

/tasks/:task_id/comments
/tasks/:task_id/comments/:comment_id
/projects/:task_id/comments
/projects/:task_id/comments/:comment_id
所以,回答你的问题:不;无法使用资源构建所需的特定路由。RESTful路线是一种非常固执己见和规定性的方法

他们是不错的意见,你会发现rails对每件事都有自己的意见。如果您继续这样做,您将从rails中获得很多价值。如果你决定走自己的路;您可能需要重新考虑并找到一个不那么固执己见的框架

在routes.rb中,请尝试以下操作

resources :tasks, only: [:index, :show] do
    resources :comments, only: [:index, :show]
end

resources :projects, only: [:index, :show] do
    resources :comments, only: [:index, :show]
end
然后运行
rake routes
,查看应用程序中的所有URL以及它们指向的控制器

使用此模式时,需要更改控制器的工作方式

有理由不使用RESTful路由模式。也许你的旧应用已经有了这些URL,你不想打破旧的路径。但如果你是新手,并且添加了这些非基于资源的路线,你可能会打破应用程序中使用的现有设计模式

这并没有回答如何重写控制器,或者您可能希望使用“可注释”关注点来允许您的项目、任务等共享关于如何获取注释的代码。这些是不同的问题,你应该先自己尝试一下

但我希望这有助于您更好地了解路线和资源。欢迎来到rails


另请参见

我不确定您是否正确地假设不相关的代码是不相关的。
/comments/foo/1
/comments/bar/1
之间有区别吗?这是一个如何将注释映射到RESTful资源的问题。“object”这个名称非常模糊,因此很难知道发生了什么,资源的结构也可以更好。如果您不想共享代码,或者即使您想共享,快速描述对象关系模型也会有所帮助。好的,用更多代码更新:object_type只是不同类型的注释hmm。对象:)例如任务、项目等等,它用于区分数据库中正确的id列