2 Stimmen

Wie kann ich meine Controller-Aktionen TROCKEN machen?

Angenommen, ich habe den folgenden Controller:

class FooController < ApplicationController

  def show
  end

  def a
    foo = Foo.find(params[:id])
    foo.a

    redirect_to foo_url(foo)
  end

  def b
    foo = Foo.find(params[:id])
    foo.b

    redirect_to foo_url(foo)
  end

  def c
    foo = Foo.find(params[:id])
    foo.c

    redirect_to foo_url(foo)
  end

end

Gibt es eine Möglichkeit, einen after_filter zu erhalten, um den gemeinsamen Umleitungscode auszuführen?

2voto

Harish Shetty Punkte 63187

Versuchen Sie dies:

class FooController < ApplicationController

  def show
  end

  [:a, :b, :c].each do |name|
    define_method(name) do
      foo = Foo.find(params[:id])
      foo.send(:name)
      redirect_to foo_url(foo)    
    end
  end
end

2voto

nathanvda Punkte 48972

Eine after_filter wird in dieser Situation nicht funktionieren.

Ich würde den folgenden Ansatz wählen.

class FooController < ApplicationController

  before_filter :get_foo, :only => [:a, :b, :c]

  def show
  end

  def a
    do_and_redirect(:a)
  end

  def b
    do_and_redirect(:b)
  end

  def c
    do_and_redirect(:c)
  end

  private

  def get_foo
    @foo = Foo.find(params[:id])
  end

  def do_and_redirect(method_name)
    @foo.send(method_name)
    redirect_to foo_url(@foo)
  end

end

1voto

Chris Ledet Punkte 11328

Hier ist Ihr Code umstrukturiert:

class FooController < ApplicationController

  before_filter :get_foo, :except => [:show]

  def show
  end

  def a
    @foo.a
    redirect_to @foo
  end

  def b
    @foo.b
    redirect_to @foo
  end

  def c
    @foo.c
    redirect_to @foo
  end

  private

  def get_foo
    @foo = Foo.find(params[:id])
  end

end

0voto

MrDanA Punkte 11383

Ich habe es nicht ausprobiert, aber http://rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html#M000319 sagt, dass Sie den after_filter verwenden können.

0voto

kain Punkte 5360

Lassen Sie es, wo es ist. after_filters wird in diesem Fall nicht funktionieren.

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