Я пытаюсь создать «общедоступную» ссылку, которая дает кому-то доступ к определенной странице моего приложения без необходимости входа / авторизации.
Я немного растерялся, чтобы найти лучший способ решить эту проблему, поэтому обращаюсь за советом.
Для начала я добавил random_id
в таблицу объекта, вокруг которого строю ссылку (Captable
).
С чем я сейчас борюсь: должен ли я создать совершенно новый контроллер (например, PublicCaptableController
) и просмотреть эту общедоступную ссылку, чтобы я мог контролировать то, что увидит этот «публичный зритель»? Или есть какой-нибудь более простой способ создания нового представления с использованием моего существующего CaptablesController, который обслуживает выбранный набор информации, которой я могу управлять с помощью существующего контроллера?
Одна из моих идей заключалась в том, чтобы отредактировать application_controller.rb
следующим образом:
before_action :authenticate_user!, unless: -> params[:random_id].present?
Но это похоже на довольно большую угрозу безопасности. Как я могу сделать это простым, но более эффективным / безопасным способом?
Благодарен за любое руководство / помощь!
Вот мой routes.rb
файл.
Rails.application.routes.draw do
devise_for :users
get '/landing', :to => redirect('/landing.html')
root 'companies#index'
post "companies/switch_current_company_context" => "companies#switch_current_company_context"
resources :companies do
resources :shareholders
resources :captables do
post :subscribe_to_captable
resources :events do
post :lock_event
post :unlock_event
resources :transactions
end
end
end
end
фрагмент из CaptablesController
class CaptablesController < ApplicationController
before_action :set_company
before_action :set_captable, only: [:show, :edit, :update, :destroy]
def index
@captables = @company.captables
end
def show
@captable = Captable.find(params[:id])
end
Фрагмент из ApplicationController
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception, unless: -> { request.format.json? }
before_action :authenticate_user!
def after_sign_in_path_for(resource_or_scope)
# Set a default current company scope for a use after signing in
session[:current_company] = current_user.companies.first.id unless current_user.companies.empty?
puts session[:current_company]
companies_path
end
end