Rails метод сборки вложенных ресурсов с блогами и постами - PullRequest
3 голосов
/ 16 марта 2012

Я создаю приложение, используя Ruby on Rails, и в панели администратора есть контроллеры blogs и posts.Маршруты для административной области выглядят так:

constraints :subdomain => "admin" do
  scope :module => "admin" do
    root to: "pages#index"
    resources :blogs do
      resources :posts, :controller => "posts"
    end
  end
end

У меня есть http://admin.mydomain.com/blogs, показывающий блоги с /blogs/2/, показывающие записи в этом блоге.поскольку при создании нового сообщения в /blogs/2/posts/new к сообщению прикрепляется blog_id.

В admin/posts_controller.rb у меня это как действие создания

def create
  @post = Post.new(params[:post])

  if @post.save
    redirect_to posts_path, notice: 'Post was successfully created.'
  else
    render action: "new"
  end
end

момент он просто создает пост.Я хочу связать это сообщение с текущим идентификатором блога, который находится в URL - /blog/2.

Как мне поступить?

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Есть несколько способов сделать это, и это зависит от того, как вы на самом деле используете контроллер. Если вы просто редактируете сообщения в / blogs / 1 / xxxx, то вы можете сделать это:

blog_id будет доступен как params[:blog_id]. Обычно я создаю before_filter, чтобы найти блог, а затем делаю остальное в действии create:

before_filter do
  @blog = Blog.find(params[:blog_id])
end

def create
  @post = @blog.posts.build(params[:post])
  if @post.save
    redirect_to [@blog, @post], notice: 'Post created successfully'
  else
    render :action => 'new'
  end
end
2 голосов
/ 16 марта 2012

Для этого вы хотите использовать возможности ассоциаций ActiveRecord, что-то вроде этого должно работать:

def create
  @blog = Blog.find_by_id(params[:id])

  if @blog
    @post = @blog.posts.new(params[:post])
    if @post.save
      redirect_to posts_path, notice: 'Post was successfully created.'
    end
  end

  render :new  
end 

Сначала найдите сообщение в блоге, которое, согласно вашему маршруту, будет: id в хэше params. Затем используйте @blog.posts.new, чтобы создать новую запись, связанную с этим блогом.

...