0

У меня есть модели пользователей и кампаний. I гнездятся кампании под пользователей и URL, выглядит следующим образом:Как использовать историю friendly_id с вложенными ресурсами

http://localhost:3000/user-slug/campaign-slug

Маршруты: модель

resources :users, :path => '' do 
    resources :campaigns, :path => '' 
end 

кампании:

class Campaign < ActiveRecord::Base 
    ... 
    extend FriendlyId 
    friendly_id :title, use: :history 
    ... 
end 

Моя модель Пользователь не использует историю.

контроллер кампании (от friendly_id гида):

class CampaignsController < ApplicationController 
    before_filter :find_campaign 

    def show 
    @campaign = Campaign.friendly.find(params[:id]) 
    end 

    private 

    def find_campaign 
    @campaign = Campaign.friendly.find(params[:id]) 

    # If an old id or a numeric id was used to find the record, then 
    # the request path will not match the post_path, and we should do 
    # a 301 redirect that uses the current friendly id. 
    if request.path != campaign_path(@campaign) 
     return redirect_to @campaign, :status => :moved_permanently 
    end 
    end 
end 

Когда я посещаю старый слизняк, чтобы вызвать переназначение я получаю эту ошибку:

ActionController::UrlGenerationError in CampaignsController#show 

No route matches {:action=>"show", :controller=>"campaigns", :format=>nil, :id=>nil, :user_id=>#<bunch of other stuff in here>} missing required keys: [:id] 

Не знаю, как я должен настроить метод перенаправления на сделай так, чтоб это работало.

ответ

0

Управляемый, чтобы заставить его работать с этим:

def find_campaign 
    @campaign = Campaign.friendly.find(params[:id]) 
    @user = @campaign.user 

    # If an old id or a numeric id was used to find the record, then 
    # the request path will not match the campaign_path, and we should do 
    # a 301 redirect that uses the current friendly id. 
    request_slug = params[:id] 
    if request_slug != @campaign.slug 
     return redirect_to user_campaign_path(@user, @campaign), :status => :moved_permanently 
    end 
    end 

Вместо сравнения запроса пути я сравнивал запрос слизняка, который не имеет часть до косой черты. И мне нужно было перенаправить на правильный маршрут user_campaign_path.

Смежные вопросы