首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Rails 5.2中,无法访问多态关联中的某些路由

是由于Rails默认的路由生成器无法正确处理多态关联的路由。这个问题可以通过手动定义路由来解决。

首先,我们需要在路由文件中手动定义多态关联的路由。假设我们有一个多态关联的模型叫做"Comment",它可以关联到不同的模型,比如"Post"和"Article"。我们可以按照以下方式定义路由:

代码语言:txt
复制
# routes.rb

resources :posts do
  resources :comments, only: [:index, :new, :create]
end

resources :articles do
  resources :comments, only: [:index, :new, :create]
end

上述代码中,我们分别为"Post"和"Article"模型定义了相应的路由。这样,我们就可以通过访问/posts/:post_id/comments/articles/:article_id/comments来访问多态关联中的某些路由。

接下来,我们需要在控制器中处理这些路由。假设我们有一个"CommentsController",我们可以按照以下方式定义相关的动作:

代码语言:txt
复制
# comments_controller.rb

class CommentsController < ApplicationController
  before_action :set_commentable

  def index
    @comments = @commentable.comments
  end

  def new
    @comment = @commentable.comments.new
  end

  def create
    @comment = @commentable.comments.new(comment_params)
    if @comment.save
      redirect_to @commentable, notice: 'Comment was successfully created.'
    else
      render :new
    end
  end

  private

  def set_commentable
    if params[:post_id]
      @commentable = Post.find(params[:post_id])
    elsif params[:article_id]
      @commentable = Article.find(params[:article_id])
    end
  end

  def comment_params
    params.require(:comment).permit(:content)
  end
end

上述代码中,我们通过before_action方法在执行相关动作之前先调用set_commentable方法来设置@commentable变量。根据路由中的参数,我们可以判断出当前关联的模型是"Post"还是"Article",然后找到相应的记录。

最后,我们需要在视图中使用这些路由。假设我们有一个"comments/index.html.erb"视图,我们可以按照以下方式使用路由:

代码语言:txt
复制
<!-- comments/index.html.erb -->

<% @comments.each do |comment| %>
  <p><%= comment.content %></p>
<% end %>

<%= link_to 'New Comment', new_polymorphic_path([@commentable, :comment]) %>

上述代码中,我们使用new_polymorphic_path方法来生成新评论的路由。这个方法会根据当前关联的模型自动选择正确的路由。

总结一下,在Rails 5.2中,无法访问多态关联中的某些路由可以通过手动定义路由、处理控制器和使用视图中的路由辅助方法来解决。这样,我们就可以正确地访问多态关联中的路由了。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Rails路由

用于生成路径和URL地址辅助方法 创建资源路由时,会同时创建多个可以控制器中使用辅助方法,如上面的资源路由会创建以下方法: photos_path:返回值为 /photos new_photos_path...有时候复数资源希望能够不使用ID就能查找资源,如显示当前登录用户信息: get 'profile', to: 'users#show' 如果 get 方法to选项值是字符串,那么这个字符串应该使用...把控制器放入同一命名空间是非常常见,如将管理员有关控制器置于 Admin:: 命名空间中,这样可以把控制器文件放在 app/controllers/admin 文件夹路由中这样声明: namespace...方法时传入一组对象,Rails会自动确定对应路由Rails能够识别各个实例,自动使用...动作上,并把参数1传入params[:id],并将路由映射到 PhotosController#display 上,并且 /photos 请求也会映射到这个控制器动作上,因为 :id 括号,是可选参数

4.4K20

使用Ruby on Rails和Bootstrap开发社交网络平台详细教程

你可以使用以下命令进行安装:gem install rails步骤2:创建Rails应用使用以下命令终端创建一个新Rails应用:rails new social_network然后进入应用目录:.../routes.rb添加社交网络功能路由:resources :friendships, only: [:create, :destroy]resources :posts生成Post模型和控制器:...app/models/user.rb添加关联:class User < ApplicationRecord has_many :posts has_many :friendshipsend步骤8...步骤10:运行应用运行以下命令启动Rails服务器:rails server然后浏览器访问http://localhost:3000,你将看到你社交网络平台。...随着你学习深入,你可以添加更多功能,例如用户认证、用户间关系、帖子、评论等,以创建一个更加完整和实用社交网络应用。祝你Ruby on Rails开发之旅取得成功!

17710

看完这篇,python面试稳了!(上)

obj.方式去访问里面的名字,这本身就是一种封装 第二层面:类某些属性和方法隐藏起来(或者说定义成私有的),只内部使用、外部无法访问,或者留下少量接口(函数)供外部访问。...多态:Python天生是支持多态。...指的是基类同一个方法不同派生类中有着不同功能 二.python面向对象继承有什么特点 继承概念实现方式主要有2类:实现继承、接口继承。...装饰器: 能够不修改原函数代码基础上,执行前后进行定制操作,闭包函数一种应用 场景: - flask路由系统 - flask before_request - csrf...含义:装饰器本质就是函数,为其他函数添加附加功能 原则:不修改被修饰函数代码,不修改被修饰函数调用方式 应用场景:无参装饰器在用户登录 认证中常见,有参装饰器flask路由系统见到过 import

39430

GitHub 关系型数据库垂直分库实践

十多年前,与当时大多数 Web 应用程序一样,GitHub 也是一个使用 Ruby on Rails 开发网站,它大部分数据都保存在 MySQL 数据库。...例如,我们单独将某些功能数据保存在独立 MySQL 数据库;我们增加了读副本数量,将读负载分摊到多台机器上;我们还使用了 ProxySQL,减少主 MySQL 实例打开连接数。... Rails 应用程序,这些信息保存在 db/schema-domains.yml 配置文件,如下所示: gists: - gist_comments - gists - starred_gists...结果被收集起来,用于分析哪些地方存在跨领域事务,这样我们就可以决定是否要更新某些代码或修改我们数据模型。 对于那些对事务一致性要求很高地方,我们将数据抽取到同属一个模式领域新表。...有了 ProxySQL,我们可以快速改变数据库流量路由,将对客户端(也就是我们 Rails 应用程序)影响降到最低。 基于这样结构,我们可以很自然地将数据库连接迁移到 cluster_b。

1.5K11

Java 小白成长记 · 第 5 篇《Java 是如何实现封装 — 图解访问修饰符》

继承是多态前提 「多态」:所谓多态就是同一函数名具有不同功能实现方式 抽象和类概念想必通过前面四篇文章,大家已经了解差不多了,那么这篇文章我们就来讲解 Java 作为一种面向对象编程语言,它是如何实现封装...包概念 具体学习访问修饰符之前,我们还需要掌握包概念,因为尽管 Java 设计了严格访问修饰符,但是这种机制仍然不够完善,其中存在问题就是如何将类库组件捆绑到一个内聚类库单元,意思就是说如何将某些关联类汇总到一个大组织中进行统一管理...而 bite方法未声明访问修饰符,具有包访问权限,即它只给 A.B 包类提供访问权,所以 bite() 方法对于 A 包 Dinner类来说是无法访问。...同一包其他类无法访问 private 成员,因此这等于说是自己隔离自己。 ?...(而对于包访问权限来说,如果子类和父类不在一个包下,子类是无法访问父类具有包访问权限成员) ?

50120

使用rails实现最简单CRUD

接下来定义控制器: class HelloController < ApplicationController def index end end rails足够智能可以自己视图文件夹寻找名为 index.html.erb...视图文件,将视图文件写入以下内容 hello, rails 此时,浏览器打开 / 和 /hello/index/ 路径都将返回同样内容 ?...使用以下命令生成控制器: rails generate controller Articles 配置articles路由: resources :articles 使用 rails routes 命令查看当前路由配置...按照上文中方法创建好 new.html.erb 文件和 new 方法, new.html.erb 文件写入: new article <%= form_with(scope:...此时我们需要定义提交之后处理路径,从上面的路由配置我们可以知道对应于 create 方法 def create @article = Article.new(article_params)

3.1K40

从Web开发者视角来解读MVC架构

此类框架另一个特点是:同一个框架可能会将其应用程序放置控制器,然后将另一部分放置模型。因此不少Web开发人员认为MVC架构略显混乱,甚至毫无固定章法可循。...通常情况下,它与MySQL之类关系型数据库,以及MongoDB之类NoSQL数据库进行交互。不过这并不重要,支持多种数据库不同框架,模型代码能够一直保持相同。...由于这些动作无法直接从浏览器中生成,因此您只能自行产生一个GET或POST,或者是通过内置某个框架HTTP客户端,来达到该目的。 在此,控制器充当是模型与视图之间中间人角色。...控制器需要通过模型从数据库获取某些数据,而控制器获取到相关数据之后,通过加载视图方式,将该数据传递给它。接着,模板引擎接管后续“任务”,实现输出变量之类逻辑事务。...接着,“路由器”开始调用基于该路由特定控制器方法。因此,如果需要使用或获取一些数据的话,控制器需要与模型进行交互,而该模型也会与后台数据库进行交互。

3.5K20

马斯克被Twitter脆弱代码“逼疯”,要求全部重写!网友:重构是空降领导了解当前系统最快方式?

作者|褚杏娟、核子可乐 “从始至终,我们一直都笑呵呵。” 当地时间周一上午,Twitter 网站又出了新故障。 有 Twitter 用户登录之后发现了一大堆相互关联问题。...此外,还有用户报告称无法访问 Twitter 推出专业用户客户端 TweetDeck。...一条推文中,该公司做了一番相当模糊解释:Twitter 某些部分现在可能无法按预期工作。我们开展了内部调整,但产生了一些意想不到后果。...看起来马斯克只是不了解 Twitter 技术堆栈依赖关系,并且试图切断对免费外部用户访问时,无意中下令关闭了 Twitter 对它们自己 API 内部访问。”...有位现任员工提到,“Twitter 1.0 带来了太多技术债务。如果现在做出变更,那么一切都会崩溃。” 比如,Twitter 早期开发时,MVP 选用了 Rails

81720

Java学习day06--多态,抽象,接口,匿名内部类

2018.6.9 1.多态 多态是同一个行为具有多个不同表现形式或形态能力。 多态就是同一个接口,使用不同实例而执行不同操作。...多态存在三个必要条件: 继承 重写 父类引用指向子类对象 注意: 当使用多态方式调用方法时,首先检查父类是否有该方法,如果 没有...成员变量 编译看左边,运行看左边 成员方法 编译看左边,运行看右边 静态方法 编译看左边,运行看左边 所以前面我说静态方法不能算方法重写 无法访问子类独有的成员变量和方法。...:可以规范子类必须实现某些功能 子类继承抽象类: 如果父类有抽象类,子类必须重写 如果子类也是抽象,那么子类继承父类抽象方法可以是抽象。...//程序第一行 import 包名; public —>都可以访问 private—>只有本类可以访问 ---- 7.内部类 类类:内部类访问外部类内容

38620

如何选择有效防火墙策略来保护您服务器

这两种方法区别在于如果刷新防火墙规则会发生什么。 如果防火墙内置策略功能设置为“丢弃”并且您防火墙规则被刷新(重置),或者如果删除了某些匹配规则,您服务将立即远程无法访问。...要阻止类型取决于网络配置 某些ICMP类型某些网络配置很有用,但在其他网络配置应该被阻止。 例如,ICMP重定向消息(类型5)可用于阐明不良网络设计。...如果您信任本地网络并希望初始配置期间发现路由低效率(修复路由是更好长期解决方案),这将非常有用。但是,不受信任网络上,恶意用户可能会发送ICMP重定向来操纵主机上路由表。...某些网络中有用且在其他网络可能有害其他ICMP类型是ICMP路由器通告(类型9)和路由器请求(类型10)数据包。...路由器通告和请求数据包用作IRDP(ICMP Internet路由器发现协议)一部分,该系统允许主机启动或加入网络时动态发现可用路由器。 大多数情况下,主机最好为其将使用网关配置静态路由

2.3K20

Loco:Rails 灵感启发新 Rust 框架

不过,这么做代价是可能缺乏灵活性,而且这种实现风格很大程度上依赖于约定和模式。 就 Rails 框架而言,这种方式多年以来广受赞誉。Rails 普及率非常高,并启发了其他许多框架。...Loco 可以 Rust 生态系统中使用惯用语法进行安装: $ cargo install loco-cli 与“rails new”类似,可以使用如下命令创建一个新 Loco 应用: $ loco...new("loco")) } 路由列表可以按照如下方式定义,这也与开发人员 Rails 定义路由方式类似: pub fn routes() -> Routes { Routes::new(...$ cargo loco generate migration add_web_url Loco 还提供一个测试程序,开发人员可以“Cargo.toml”启用该程序,如下所示: [dev-dependencies...它还具有默认 API 常用功能,如注册、激活、重置密码等。

20310

玩转CVM之外网不通排查

在用户使用CVM过程,经常会出现访问外网不通情况。外网不通原因从平台到系统都有可能会出现,排查时候涉及方面有很多。基于此,本文提供详细排查思路帮助各位解决类似的问题。...,具体选择哪种出口方式可以CVM坐在VPC下路由表进行配置。...如果CVM无法访问公网最先应该确保CVM有以上出口方式,以及对应路由表要设置。...有状态:返回数据流会被自动允许,不受任何规则影响。 无状态:返回数据流必须被规则明确允许。 只有启动实例同时指定安全组、或稍后将安全组与实例关联情况下,操作才会被应用到实例。...,此时CVMIP就会被隔离无法访问出去,也无法访问进来。

18.9K38017

CentOS7.x 搭建 GitLab 教程

温馨提示:此处如果设置为域名访问,如果域名没有备案就会出现无法访问,如果不想备案网站域名,那么此处直接配置为服务器公网 IP 即可。...[‘smtp_enable’] = true gitlab_rails[‘smtp_address’] = “smtp.163.com” gitlab_rails[‘smtp_port’] = 25...gitlab_rails[‘smtp_user_name’] = “xxx@163.com” gitlab_rails[‘smtp_password’] = “xxx” gitlab_rails...GitLab 并添加一个 GitLab 账户,并添加设置用户邮箱地址,测试是否可以收到邮件通知,如果创建完成,设置邮箱收到邮件说明邮件服务没有问题,注意如果没有收到邮件,有时候邮箱会拦截邮件,你垃圾邮件中看看是否邮件被拦截...,如果被拦截,你可以将此邮件添加到白名单

1.7K20

PHP将死。何以为继?

当然了,并不十分彻底;它还坚守在某些环境里,它还有相当可观数量顽 固粉丝,遗留下来应用程序也需要维护,持续几十年。...如果说Perl最缺乏是PHP里令人惊讶灵活关联数组”(也就是智 能哈希表),那么PHP现在缺乏就是lambdas和方法链(method chaining)了。...我这篇文章目的就是想试图把原因说清楚。 我主要抱怨,必须要提,就是性能。我之前就说过这种问题不应该被当作一种语言致命缺陷,它只是语言实现暂时问题。...Active Record是一种模式,并不是Ruby固有的,Rails最新版本里是可选择,但是对它使用和这种模式已经深入到了RailsDNA里了。...代码生成喜欢“神奇推理”,因为生成器并不确定代码某些特别有用特征究竟是专门写出还是语言环境固有自带。神奇推理是危险

1.5K60

代码重构之道:消灭冗长if语句,提升代码质量

使用多态 多态是一种面向对象编程技术,它允许我们根据对象具体类型来调用方法。通过使用多态,我们可以去除一些条件判断语句。...使用策略模式 策略模式是一种设计模式,它将算法封装在独立策略类,然后在运行时选择适当策略。这可以帮助我们避免大量 if语句。...使用映射表 有时,我们可以使用映射表来替代一系列 if语句。这种方法适用于某些配置或路由场景。...)); handlers.put("route2", new Route2Handler()); String route = getRouteFromRequest(); // 从请求获取路由信息...、观察者模式、装饰者模式等,都可以帮助我们去除代码if语句,提高代码可维护性和可扩展性。

16140

Gitlab 升级那些事儿

前言   Gitlab 升级策略似乎已经 私有代码托管平台搭建与运维 解释得比较详细了,但实际上忽略了秘钥文件 /home/git/gitlab/config/secrets.yml 和 /home...这两个文件不是容器内代码文件里面吗?为什么又需要备份这两个秘钥文件呢?...这两个秘钥文件涉及到数据库某些加密字段加密和解密过程,如果没有这两个原始文件或者使用了新文件,那么 Gitlab 将无法对这些数据库已有的加密字段进行解密,从而影响到某些页面的使用,尤其是管理员界面...连接数据库   以下为官方给定不同版本和安装方式下连接数据库命令。...默认 sameersbn/docker-gitlab 容器还未添加这一配置项,从而导致指标和分析页面无法访问。修复方法是, docker-compose.yml 添加该配置项,如下所示。

1.5K20
领券