0

Заранее благодарим за вашу помощь! У меня есть сайт, построенный в Ruby on Rails (2.3.15, 1.8.7), который позволяет людям создавать маршруты в разных местах и ​​с различными видами деятельности в каждом месте. У сайта есть способ убедиться, что текущий пользователь может только удалить маршруты, связанные с его учетной записью. Код в itineraries_controller.rb сделать это выглядит примерно так:Ограничить доступ к функции «уничтожить» в приложении Ruby on Rails

def destroy 
    @itinerary = Itinerary.find(params[:id]) 
    if @itinerary.user_id == current_user.id 

    @itinerary.destroy 

    respond_to do |format| 
     format.html { redirect_to('/home') } 
     format.xml { head :ok } 
    end 
    else 
    redirect_to '/' 
    end 
end 

Эта система хорошо работает. Однако я хочу сделать то же самое для деятельности. В Activity_controller я хочу, чтобы текущий пользователь мог только удалить действия, связанные с его учетной записью.

В настоящее время, вот мои четыре модели (с ненужными вещи раздели):

User.rb

class User < ActiveRecord::Base 
    has_many :itineraries 
end 

Itinerary.rb

class Itinerary < ActiveRecord::Base 
    has_many :locations 
    belongs_to :user 
end 

Location.rb

class Location < ActiveRecord::Base 
    belongs_to :itinerary 
    has_many :activities 
end 

Activ ity.rb

class Activity < ActiveRecord::Base 
    belongs_to :location 
end 

Здесь я начну с деятельности_controller.rb. FYI, my current_user.id создается аутентифицированной_системой.rb, поэтому не беспокойтесь об этой части.

def destroy 
    @activity = Activity.find(params[:id]) 
    if @itinerary.user_id == current_user.id 

    @activity.destroy 

    respond_to do |format| 
     format.html { redirect_to("/") } 
     format.xml { head :ok } 
    end 
    else 
    redirect_to '/' 
    end 
end 

Я попытался связать модели с помощью has_many: через подход, но я не знаю, как сделать это более трех моделей, и я не был уверен, что это правильный подход в любом случае. Еще раз спасибо за любую помощь, которую вы можете предоставить!

ответ

2

Вы можете просто сделать

if @activity.location.itinerary.user_id == current_user.id 
+0

Это решило! Спасибо, Исмаэль. Можете ли вы сказать мне название этого подхода, связанного с разными моделями? Я ноб, но я хотел бы узнать больше (и будет google, чтобы найти хорошие ресурсы, основанные на вашем ответе.) – KDP

+0

Вы можете делать эти танки для отношений, которые вы создали с помощью sort_to и has_many, которые устанавливают эти методы для вы. Вы можете найти информацию об этом, ели гиды –

0

Вам действительно нужно только спросить деятельность по месту своего нахождения, а затем задать место для своего маршрута, чем спросить его за пользователем. Это немного нарушает Закон Деметры, но он будет работать.

loc = @activity.location 
itin = loc.itinerary 
if itin.user_id = current_user.id 
... 

Это должно сработать.

+0

Остин, я очень ценю ваш ответ. Я пошел с другим ответом только потому, что это был более простой подход, но спасибо за ваше время. – KDP

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