3 Stimmen

Rails Build-Methode verschachtelte Ressourcen mit Blogs und Beiträgen

Ich erstelle eine App mit Ruby on Rails und im Admin-Bereich gibt es blogs und posts Controller. Die Routen für den Admin-Bereich sehen so aus:

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

Was ich habe ist http://admin.mydomain.com/blogs, das die Blogs mit /blogs/2/ anzeigt, die die Beiträge zu diesem Blog anzeigen.

Was ich möchte ist, dass beim Erstellen eines neuen Beitrags unter /blogs/2/posts/new die blog_id dem Beitrag angehängt wird.

In der admin/posts_controller.rb habe ich das als die create-Aktion

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

  if @post.save
    redirect_to posts_path, notice: 'Der Beitrag wurde erfolgreich erstellt.'
  else
    render action: "new"
  end
end

Im Moment erstellt es einfach einen Beitrag. Ich möchte diesen Beitrag mit der aktuellen Blog-ID verknüpfen, die in der URL steht - /blog/2.

Wie würde ich das angehen?

2voto

ipd Punkte 5598

Sie möchten die Power der ActiveRecord-Verknüpfungen für diese Aufgabe nutzen. Etwas wie dies sollte funktionieren:

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: 'Beitrag wurde erfolgreich erstellt.'
    end
  end

  render :new
end

Zuerst suchen Sie den Blog-Beitrag, der gemäß Ihrer Routenangabe im params-Hash die :id sein wird. Dann verwenden Sie @blog.posts.new um einen neuen Beitrag zu erstellen, der mit diesem Blog verknüpft ist.

2voto

adamcooke Punkte 376

Es gibt mehrere Möglichkeiten, dies zu tun, und es hängt davon ab, wie der Controller tatsächlich verwendet wird. Wenn Sie Beiträge nur unter /blogs/1/xxxx bearbeiten, können Sie dies tun:

Die Blog-ID steht als params[:blog_id] zur Verfügung. Ich würde normalerweise einen before_filter erstellen, um den Blog zu finden, und den Rest dann in der create-Aktion ausführen:

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: 'Beitrag erfolgreich erstellt'
  else
    render :action => 'new'
  end
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X