Ruby on rails 为rails应用程序中的显示操作创建半私有URL

Ruby on rails 为rails应用程序中的显示操作创建半私有URL,ruby-on-rails,ruby,routing,ruby-on-rails-4,Ruby On Rails,Ruby,Routing,Ruby On Rails 4,我正在开发一个小应用程序,允许用户创建列表,并在这些列表中添加他们想要的礼物。到目前为止,它与待办事项列表应用程序非常相似 我有三种型号: 用户-可以有许多列表 列表-可以有很多礼物,属于用户 礼物-属于列表 在我的列表模型中,除了存储列表的名称外,我还创建了一个唯一的字母和数字字符串,并将其作为共享密钥存储在记录中。代码如下所示: def create_unique_url begin self.shared_key = SecureRandom.urlsafe_base64(10)

我正在开发一个小应用程序,允许用户创建列表,并在这些列表中添加他们想要的礼物。到目前为止,它与待办事项列表应用程序非常相似

我有三种型号:

用户
-可以有许多列表

列表
-可以有很多礼物,属于用户

礼物
-属于列表

在我的
列表
模型中,除了存储列表的名称外,我还创建了一个唯一的字母和数字字符串,并将其作为
共享密钥
存储在记录中。代码如下所示:

def create_unique_url
  begin
   self.shared_key = SecureRandom.urlsafe_base64(10)
  end while self.class.exists?(shared_key: shared_key)
end
理想情况下,我希望url看起来像这样
app.com/public/long\u string\u shared\u key\u出现在这里

我主要的问题是,我应该如何设置一条途径来访问本次公共演讲中的记录


我是否应该创建另一个名为public的控制器,并在其中使用show方法?或者我应该在我的llist控制器中创建一个公共操作,并以某种方式手动创建到它的路由吗?

在您的情况下,我只需稍微更改列表的显示。首先在列表模型中重新定义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,但是您使用了长字符串共享密钥)


希望这能回答您的问题。

因为这只是一个单一操作的问题,我不建议重新定义#to_参数,因为它可能会影响您现有的所有功能。大多数情况下,这仍然是一个品味问题

路线:

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)