Rails: 防止id与方法冲突

Rails: Prevent id conflict with a method

我在路由中使用字符串作为 id(例如 resource/:id ),但 id 也可以是 'new'(我的控制器中的一种方法),而不是使用 id=new 显示资源,而是指向创建新资源。如何限制用户在创建新资源时选择 id=new?

尝试在模型中使用exclusion验证,http://guides.rubyonrails.org/active_record_validations.html#exclusion

config.rb 中,将您的路线更改为:

resources :resources

您将获得所需的路线。我有一种感觉,您很快就会需要它附带的一些其他功能,例如 createedit.

编辑:为了让生活更轻松,在您的模型中:

def to_param
  return self.my_string_id
end

其中 my_string_id 是您在 URL 中用作标识符的字符串。这将使 URL 将其用作 :id 参数而不是数字 ID。

参见:http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default

我可以想到三种解决方案,您可以在其中设置字符串而不是 id

首先:设置id和attribute_name的组合,添加 在你的模型中

def to_param
   return [self.id, self.attr_name].join('-')
end

其次: 阻止用户在你的控制器中添加任何操作方法(这比只限制 "new" 方法更安全,你可以在未来)

validates :attr_name, exclusion: { in: YourController.action_methods.to_a }

第三个: 使用 friendly_id gem