在不添加路由的情况下在控制器上允许多种方法的最佳方法是什么?

时间:2016-03-10 16:09:52

标签: ruby-on-rails ruby ruby-on-rails-4

大家好我来自旧学校使用rails 2.

实际上我正在使用rails 4而我正试图找到一种在控制器上创建方法而无需写入的方法

在使用的RAILS 2上:(仅需要在控制器上写下名称)

#controller
def report_a
end

def report_b
end

def report_c
end

...and whatever def

#ROUTES
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'

在RAILS 4

#controller
def report_a
end

def report_b
end

def report_c
end

#ROUTES
match ':controller(/:action(/:id(.:format)))', :via => [:get, :post]

问题出在我创建这样的视图报告时:(views / reports / report_a.html.erb)

<%= form_tag :action=>"report_a" do %>
<% end %>

我收到此消息:

No route matches [GET] "/reports/report_a"

要解决此问题,并且执行Rails指令的工作方式如下:

#controller
def report_a
  @users= User.search(params[:name])
end

def result_report_a
  @users= User.search(params[:name])
end

#view/reports/report_a.html.erb
<%= form_tag :action=>"result_report_a" do %>
<% end %>

#routes.rb
get  "reports#report_a"
post "reports#result_report_a"
get  "reports#report_b"
post "reports#result_report_b"
get  "reports#report_c"
post "reports#result_report_c"   

我也找到了更好的方法:

#controller reports.rb
def search_report_a
  report_a
  render :report_a
end

def report_a
  @users = User.where(:name=>params[:name])
end

def search_report_b
  report_b
  render :report_b
end

def report_b
 @users = User.where(:address=>params[:address])
end
...

#Routes.rb
resources :users do
  match 'search_report_a', :via => [:post,:get], :on => :collection
  match 'search_report_b', :via => [:post,:get], :on => :collection
  ...
end   

有没有其他方法来创建方法而不添加所有内部ROUTES.RB?

任何建议或唯一的方法是添加get和post?

想象一下你有几种方法的情况。

1 个答案:

答案 0 :(得分:0)

Rails中的最佳方法是使用REST架构。您的控制器应该能够查看,创建,更新和销毁某些资源(当然,所有操作都不是必需的)。

例如:

def ReportsController
  def index
    # Actions to show links to all possible reports
  end

  def show
    # Show report based on params
  end
end

您的#show方法可以通过检查来自GET请求的参数来显示任何报告(report_a,report_b等)。

并且您不需要在#show方法中制作所有逻辑。将报告相关的逻辑放在某些服务对象中会更好。