论坛首页 编程语言技术论坛

form 提交的参数直接映射成对象?

浏览 5195 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-09-03  
想编写一个类,实现类似ActiveRecord::Base 的create功能,把 form 提交的参数直接映射成对象, 该怎么做?

自己的尝试是这样的,可是提示错误却是事先没有想到的另外一个错误

  obj = MyObject.create(params)

  class MyObject
    attr_accessor :name
 def create(attributes=nil);  #ActiveRecord::Base中复制而来
        if attributes.is_a?(Array);
          attributes.collect { |attr| create(attr); }
        else
          object = new(attributes);
          scope(:create);.each { |att,value| object.send("#{att}=", value); } if scoped?(:create);
          object.save
          object
        end
      end
end

调用:
obj = MyObject.create(params)
提示 create不存在....

PS:ROR的错误提示是够烂的。
   发表时间:2006-09-03  
self.create好不好?
MyObject这个class的create方法,确实不存在阿……
0 请登录后投票
   发表时间:2006-09-04  
这段代码中不存在的东西太多了: new, scope, scoped?, save
0 请登录后投票
   发表时间:2006-09-04  
根据提示

找到了
 def scoped?(method, key = nil); #:nodoc:
          if current_scoped_methods && (scope = current_scoped_methods[method]);
            !key || scope.has_key?(key);
          end
        end

        # Retrieve the scope for the given method and optional key.
        def scope(method, key = nil); #:nodoc:
          if current_scoped_methods && (scope = current_scoped_methods[method]);
            key ? scope[key] : scope
          end
        end

发现还需要
 def current_scoped_methods #:nodoc:
          scoped_methods.last
        end

然后还要scoped_methods ...
    rails的看似简单的method,居然这么复杂...

  以我目前的理解能力,还是先用土办法处理了
0 请登录后投票
   发表时间:2006-09-04  
引用
rails的看似简单的method

ActiveRecord和Routing,号称Rails双鬼亚~~~Ruby的诡异特性用得最多的两个地方,居然“看似简单”……
0 请登录后投票
   发表时间:2006-09-04  
gigix 写道
引用
rails的看似简单的method

ActiveRecord和Routing,号称Rails双鬼亚~~~Ruby的诡异特性用得最多的两个地方,居然“看似简单”……

   居然还有这样的说法,看来我的这个想法没有足够的功力是完不成的。先放着,等过段时间再来尝试
0 请登录后投票
   发表时间:2006-09-04  
引用
form 提交的参数直接映射成对象

就这点破事……method_missing里面根据调用的方法名直接到params里面一找就搞定。
1 请登录后投票
   发表时间:2006-09-06  
class ApplicationController < ActionController::Base
  class Parameters
    def initialize(params);
      @params = params
    end

    def method_missing(method_id, *args);
      param = @params[method_id]
      return Parameters.new(param); if param.is_a?(HashWithIndifferentAccess);
      param
    end

    def [](name);
      @params[name]
    end
  end

  def p
    Parameters.new(params);
  end
end


class TestController < ApplicationController
  def test
    render :text => p.a.b[0]
  end
end


访问/test/test?a[b][]=hello会显示hello.
1 请登录后投票
   发表时间:2006-09-07  
上面这个麻烦了,有个简单的:
class HashWithIndifferentAccess
  def method_missing(method_id, *args);
    self[method_id]
  end
end

使用时只需要:
render :text => params.a.b[0]
1 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics