ОК, если вы не заинтересованы в использовании какого-либо драгоценного камня, вы можете без драгоценного камня, как
class Model < ApplicationRecord
def to_param # overridden
organization_name
end
end
в этом случае вам необходимо убедиться, что имя organization_name
является уникальным, для уникальности organization_name
вы можете использовать проверку таким образом
validates_uniqueness_of :organization_name
тогда модель будет выглядеть так
class Model < ApplicationRecord
validates_uniqueness_of :organization_name
def to_param # overridden
organization_name
end
end
и теперь для контроллера, используя find_by_organization_name(params[:organization_name])
вместо find(params[:id])
.
Второй вариант
Вы не можете ничего изменить в своем контроллере, если используете его только в этой модели
class Model < ApplicationRecord
def to_param # overridden
organization_name
"#{id} #{organization_name}".parameterize
end
end
тогда URL выглядит так /10-microsoft
.
См. Этот to_param
метод. Полный справочник с драгоценным камнем или без драгоценного камня Rails Friendly URLs
RailsCasts.com создал эпизод для Pretty URLs с FriendlyId, вы можете проверить его для получения идеи.
Из комментария
Я не думаю, что происходит, но уверен, что что-то не так с отношениями, можешь проверить вот так
redirect_to(worker.organizations.first)
#=> OR
redirect_to organization_path(worker.organizations.first.id)
Обновление
Я думаю, worker.organization
как-то не хватает, вы бы попробовали вот так?
if worker && worker.organizations.present?
redirect_to(worker.organizations.first)
....
метод present
, проверяющий worker.organizations
не пустым.
Я не знаю об отношениях, вы можете попробовать вот так и сообщить мне, что происходит, если они не работают, тогда я настоятельно рекомендую опубликовать модели с концепцией отношений.
Обновление 2 после обновления вопроса
Во-первых, вам не нужны отношения through
, потому что они используют отношения Many To Many
. Ваши отношения One To One
, тогда ваша модель будет выглядеть так
class StratumWorker < ApplicationRecord
has_one :organization_worker
....
has_one: организация,: через =>: организация_работник
organization_worker.rb
файл вроде этого
class OrganizationWorker < ApplicationRecord
belongs_to :stratum_worker
#=> Add code what you need like for URL which was the actual motive in this post
....
Тогда действие выглядит так
def index
worker_id = params[:worker_id]
worker = StratumWorker.find_by_id(worker_id)
if worker && worker.organization_worker.present?
#redirect_to(worker.organization_worker)
redirect_to organization_path(worker.organization_worker)
else
render :file => "#{Rails.root}/public/404", layout: false, status: 404
end
end
и шоу-экшн
OrganizationWorker.find(params:id)
Я думаю, что проблема решится сейчас. Если вы по-прежнему получаете ошибки, прочитайте, пожалуйста, отношения One To One
снова и снова, пока не очистите концепцию отношений.
Надеюсь, это поможет.