在rails app中为show动作创建半私有URL

时间:2014-01-14 20:21:51

标签: ruby-on-rails ruby routing ruby-on-rails-4

我正在构建一个小应用程序,允许用户创建列表,在这些列表中,他们可以添加他们想要的礼物。到目前为止它非常类似于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控制器中创建一个公共操作,并以某种方式手动创建一个到它的路由?

2 个答案:

答案 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 )。

希望这能回答你的问题。