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
您将获得所需的路线。我有一种感觉,您很快就会需要它附带的一些其他功能,例如 create
和 edit
.
编辑:为了让生活更轻松,在您的模型中:
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
我在路由中使用字符串作为 id(例如 resource/:id ),但 id 也可以是 'new'(我的控制器中的一种方法),而不是使用 id=new 显示资源,而是指向创建新资源。如何限制用户在创建新资源时选择 id=new?
尝试在模型中使用exclusion
验证,http://guides.rubyonrails.org/active_record_validations.html#exclusion
在 config.rb
中,将您的路线更改为:
resources :resources
您将获得所需的路线。我有一种感觉,您很快就会需要它附带的一些其他功能,例如 create
和 edit
.
编辑:为了让生活更轻松,在您的模型中:
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