Есть ли какая-то частичная вещь для контроллеров в Ruby on Rails - PullRequest
2 голосов
/ 17 июля 2010

У меня есть контроллер, имеющий более 1000 строк кода.

Правильно, я не делаю проверку кода для этого контроллера. Я организую свои методы в соответствии с модулем. Теперь я понимаю, что мой контроллер не прост в обслуживании, и поэтому я хочу что-то вроде следующего

class UsersController < ApplicationController  
  #Code to require files here 
  #before filter code will goes here 

  #############Here i want to call that partial like things. following is just pseudo #########
    history module
    account module
    calendar module
    shipment module
    payment module
 ####################################################################

end #end of class

это так сильно помогает мне в поддержании кода, что когда я меняю модуль истории, я уверен, что модуль моего аккаунта не изменился. Я знаю CVS, но предпочитаю 50 копий каждого модуля вместо 200 копий самого моего users_controller.rb. 1006 *

P.S. : - Я хотел бы утвердительный ответ. Пожалуйста, не отвечайте, как, вы должны использовать другой контроллер для другого модуля ..... бла ... бла ... бла ... так как я не могу это сделать.

РЕДАКТИРОВАТЬ: - Мои версии

rails -v
  Rails 2.3.4
ruby -v
  ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-linux]

Ответы [ 3 ]

5 голосов
/ 17 июля 2010

Это должно работать для вас:

app/controllers/some_controller.rb

class SomeController < ApplicationController
  include MyCustomMethods
end

lib/my_custom_methods.rb

module MyCustomMethods
  def custom
    render :text => "Rendered from a method included from a module!"
  end
end

config/routes.rb

# For rails 3:
match '/cool' => "some#custom"

# For rails 2:
map.cool 'cool', :controller => "some", :action => "custom"

Запустите ваше приложение и нажмите http://localhost:3000/cool,, и вы получите свой собственный метод, включенный из модуля.

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

Предполагая, что от вашего псевдокода вы ссылаетесь на модули Ruby, а не на что-то другое, просто поместите все ваши требования / модули в отдельный модуль и включите его или пусть ваш UsersController наследуется от базового класса, если вы повторно используете эти файлы.В первом случае вы можете думать о модуле как о дополнительном модуле, и он предназначен именно для той модульности, которую вы хотите.

module AllMyStuff
  include History
  include Account
  ...
end

class UsersController < ApplicationController
  include AllMyStuff

  def new
  end
  ...
end

, или вы можете наследовать от базового контроллера, в этом случае его, вероятно,разумное решение.

def BaseController < ActionController
  include history
  include account
end

def UsersController < BaseController
  # modules available to this controller by inheritance
  def new
  end
  ...
end
0 голосов
/ 17 июля 2010

Я попробовал следующий метод, и он работает, может быть, он подходит для вас:

Приложение / user_controller.rb

require 'index.rb'
class UsersController < ApplicationController  
  # some other code
end

Приложение / index.rb

class UsersController < ApplicationController

def index
  @users = User.all
end

end

МОЙ ENV: рельсы 3 бета4

...