Ruby on Rails: возможно ли расширить метод, не переопределяя его? - PullRequest
0 голосов
/ 09 июля 2010

Я хочу изменить перенаправление в методе создания, но не хочу переопределять все это.

как, по умолчанию, если create (скажем, существует), он будет иметь что-то вроде

  respond_to do |format|
      if @user.save(params[:user])
        flash[:notice] = 'The user has been updated'
        format.html { redirect_to :controller => "subscriptions",
                                  :action => "show",
                                  :id => @user.account_id }
        format.xml { head :ok }
      else
        format.html { render :action => :edit }
            format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
        end
    end

или что-то в этом роде ...

но где написано format.html ... Я хочу иметь возможность изменить redirect_to в моем классе, который наследует этот метод ... но я не хочу переписывать все это. = \

идеи

Ответы [ 2 ]

1 голос
/ 09 июля 2010

Вызов super не решит вашу проблему, потому что вы хотите изменить внутреннюю работу метода, а не передавать новые параметры или добавить к нему код.

Я бы создал третью функцию(давайте назовем это common_routine), который имеет общую функциональность.Затем вы вызываете common_routine из обоих мест, которые должны получить к нему доступ.Однако, чтобы изменить код по мере необходимости, вы передадите ему блок и выдадите этот блок внутри метода, чтобы изменить его метод.

пример:

def common_routine
  respond_to do |format|
    if @user.save(params[:user])
      flash[:notice] = 'The user has been updated'
      format.html { yield }
      format.xml { head :ok }
    else
      format.html { render :action => :edit }
      format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
    end
  end
end

Затемвы вызываете его с помощью:

common_routine { redirect_to :controller => "subscriptions", :action => "show", :id => @user.account_id }

или

common_routine { redirect_to root_path }

Кодовый блок, который вы передаете в common_routine, будет "уступать", что позволяет вам иметь те же функциональные возможности с незначительными изменениями,необходимо.

0 голосов
/ 09 июля 2010

Если вы знаете, какие аргументы использует оригинальный метод, вы можете вызвать метод super.

class Foo
  def foo(arg)
    arg*2
  end
end

class Bar < Foo
  def foo(arg)
    super(arg) + 3
  end
end

a = new Foo
a.foo(2)     # => 4
b = new Bar
b.foo(2)     # => 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...