контроллер rails для смешанных вложенных и не вложенных ресурсов - PullRequest
9 голосов
/ 15 января 2012

Я работаю над приложением, похожим на блог, мой пользовательский модуль has_many posts и модуль posts принадлежит__ user

Я хочу получить доступ к обоим пользователям /: id / posts и posts /

route.rb выглядит примерно так:

resources :users do
  resources :posts
end

resources:posts

как я могу узнать в контроллере постов, доступен ли он напрямую (/ posts) или через вложенный маршрут (/ users /: id / posts)?

например, каким должен быть метод index контроллера сообщений для правильного действия INDEX для / users /: id / posts и для / posts

Есть ли лучший способ сделать это?

Ответы [ 2 ]

7 голосов
/ 16 января 2012

Одним из решений может быть использование фильтра до на вашем контроллере, например:

before_filter :load_user

def load_user
  @user = User.find(params[:user_id]) if params[:user_id]
  @posts = @user ? @user.posts : Post.scoped
end

Затем вам нужно немного переписать контроллер, чтобы он функционировал должным образом.

Не требуется рефакторинг для действия index, @posts уже загружен правильно, но вы можете выполнять дальнейшую фильтрацию по своему усмотрению

def index
  @posts = @posts.where('updated_at < ?' Time.now)
end

Затем обновите каждое действие члена: новое, создать, показать, редактировать, обновить, уничтожить и использовать сообщения в качестве базы, например:

def new
  @post = @posts.build
end

def create
  @post = @posts.build(params[:task])
end

def show
  @post = @posts.find(params[:id])
end

def edit
  @post = @posts.find(params[:id])
end

def update
  @post = @posts.find(params[:id])
end

def destroy
  @post = @posts.find(params[:id])
end

Конечно, вы можете добавить другие фильтры перед удалением дубликата кода.

1 голос
/ 15 января 2012

Проверьте параметры.

Если вы просто отправите сообщение, у вас будет :id

Если пользователь / пост, у вас будет пользователь и ID для поста.

Так проверьте, если params[:user] ...

n.b. Если не пользователь, попробуйте params[:user_id]

Что касается index метода для posts Я думаю, что в обоих случаях он будет ОДНО ЖЕ. Что изменит вещи, так это их использование, ассоциация и область действия внутри пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...