【问题标题】:Where do I put 'helper' methods?我在哪里放置“帮助”方法?
【发布时间】:2009-03-02 10:56:50
【问题描述】:

在我的 Ruby on Rails 应用程序中,我有:

class AdminController < ApplicationController
  def create
    if request.post? and params[:role_data]
      parse_role_data(params[:role_data])
    end

  end
end

还有

module AdminHelper
  def parse_role_data(roledata)
    ...
  end
end

但我收到一条错误消息,提示 parse_role_data 未定义。我做错了什么?

【问题讨论】:

    标签: ruby-on-rails ruby helper


    【解决方案1】:

    Helper 主要用于复杂的输出相关任务,例如根据日期列表为日历制作 HTML 表格。任何与业务规则相关的东西,比如解析文件都应该放在关联模型中,一个可能的例子如下:

    class Admin < ActiveRecord::Base
      def self.parse_role_data(roledata)
        ...
      end
    end
    
    #Call in your controller like this
    Admin.parse_role_data(roledata)
    

    在创建路由时还要考虑使用(RESTful 路由或 :conditions 选项)[http://api.rubyonrails.org/classes/ActionController/Routing.html],而不是在控制器中检查request.post?

    【讨论】:

    • 嗯...但我有一个管理控制器,但没有管理模型。
    • 您可以轻松地定义没有子类的模型,即。 class Admin。如果该文件不存在,只需在模型目录中创建一个名为admin.rb 的文件。
    • 现在我得到“Admin:Class 的未定义方法 `parse_role_data'”。
    • 你定义的方法是不是前面有self,比如def self.parse_role_data(roledata)
    【解决方案2】:

    您不应该通过 AdminHelper 访问 parse_role_data 吗?

    更新 1: 检查此 http://www.johnyerhot.com/2008/01/10/rails-using-helpers-in-you-controller/

    【讨论】:

    • 虽然对于使用 ActionView 提供的与格式化相关的帮助程序等细节很有用,但完整的业务代码确实属于模型。
    【解决方案3】:

    从外观上看,您是否正在尝试创建用于向用户添加角色的 UI。我假设你已经有一个 UsersController,所以我建议添加一个 Role 模型和一个 RolesController。在您的 routes.rb 中,您会执行以下操作:

    map.resources :users do |u|
        u.resources :roles
    end
    

    这将允许您拥有如下路线:

    /users/3/roles
    

    在您的 RolesController 中,您可以执行以下操作:

    def create
        @user = User.find_by_username(params[:user_id])
        @role = @user.roles.build(params[:role])
        if @role.valid?
            @role.save!
            redirect_to @user
        else
            render :action => 'new'
        end
    end
    

    这将从新操作中显示的表单中获取角色参数数据,并为该用户创建一个新角色模型。希望这对您来说是一个很好的起点。

    【讨论】:

    • 没错,但希望它能突出他做错了什么。想要在控制器中使用助手通常表明您在模型中做得不够。