我正在构建一个小应用程序,允许用户创建列表,在这些列表中,他们可以添加他们想要的礼物。到目前为止它非常类似于ToDo列表应用程序。
我有三种模式:
User
- 可以有多个列表
List
- 可以有很多礼物,属于用户
Gift
- 属于列表
在我的List
模型中以及存储列表名称时,我还创建了一个唯一的字母和数字字符串,并将其存储为记录中的shared_key
。代码如下所示:
def create_unique_url
begin
self.shared_key = SecureRandom.urlsafe_base64(10)
end while self.class.exists?(shared_key: shared_key)
end
理想情况下,我希望网址看起来像app.com/public/long_string_shared_key_goes here
我的主要 问题 是,如何设置路线以访问此公共地址的记录。
我应该创建另一个名为public的控制器并在那里有show方法吗?或者我应该在我的llist控制器中创建一个公共操作,并以某种方式手动创建一个到它的路由?
答案 0 :(得分:1)
由于这只是单一操作的问题,我不建议重新定义#to_param,因为它可能会影响您现有的所有功能。仍然是品味问题,主要是
路线:
resources :lists, except: [ :show ]
get '/public/:shared_key' => 'lists#show'
控制器:
def show
@list = List.find_by(shared_key: params[:shared_key])
end
视图:
link_to list.name, list_path(shared_key: list.shared_key)
答案 1 :(得分:0)
在你的情况下,我只会改变一下列表的显示。列表模型中的第一个重新定义了to_param方法
def to_param
long_string_shared_key_goes #by default this was returning the id - example...to access show a list you had to navigate to /lists/:id
end
现在您需要更改routes.rb
match 'public/:long_string_shared_key_goes', to :'lists#show', via: [:get]
现在你只需要更改一些查找方法(如果你使用示例list.find访问列表(params [:id]你现在必须考虑到你没有params中的id,但是你long_string_shared_key )。
希望这能回答你的问题。