浏览 5195 次
锁定老帖子 主题:form 提交的参数直接映射成对象?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-09-03
自己的尝试是这样的,可是提示错误却是事先没有想到的另外一个错误 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的错误提示是够烂的。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-09-03
self.create好不好?
MyObject这个class的create方法,确实不存在阿…… |
|
返回顶楼 | |
发表时间:2006-09-04
这段代码中不存在的东西太多了: new, scope, scoped?, save
|
|
返回顶楼 | |
发表时间: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,居然这么复杂... 以我目前的理解能力,还是先用土办法处理了 |
|
返回顶楼 | |
发表时间:2006-09-04
引用 rails的看似简单的method
ActiveRecord和Routing,号称Rails双鬼亚~~~Ruby的诡异特性用得最多的两个地方,居然“看似简单”…… |
|
返回顶楼 | |
发表时间:2006-09-04
gigix 写道 引用 rails的看似简单的method
ActiveRecord和Routing,号称Rails双鬼亚~~~Ruby的诡异特性用得最多的两个地方,居然“看似简单”…… 居然还有这样的说法,看来我的这个想法没有足够的功力是完不成的。先放着,等过段时间再来尝试 |
|
返回顶楼 | |
发表时间:2006-09-04
引用 form 提交的参数直接映射成对象
就这点破事……method_missing里面根据调用的方法名直接到params里面一找就搞定。 |
|
返回顶楼 | |
发表时间: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. |
|
返回顶楼 | |
发表时间:2006-09-07
上面这个麻烦了,有个简单的:
class HashWithIndifferentAccess def method_missing(method_id, *args); self[method_id] end end 使用时只需要: render :text => params.a.b[0] |
|
返回顶楼 | |