exception.backtrace
网站做的不错哦,顶一下。
顶起呀。
统一的处理方式就是用 rails 的 router 但是显然楼主你把这么好的工具给抛弃了
无论多少个都是会按定义的顺序依次执行的。
你把 class_eval
用错了,class_eval
有两种用法:1、接受字符串做参数
2、接受 一个 block({...} 或者 do ... end)
作为参数。
class MyClass
end
# 用法一
code = "def test; 'my test'; end"
MyClass.class_eval(code)
# 用法二
MyClass.class_eval { def test; "my_test"; end }
当然你也可以在串字符串做参数的同时给 class_eval
带一个 block 过去。
另外:
{ .. }
和 do ... end
的区别是:
1、按照惯例一般 {} 用于一行代码的 block,而 do...end 用于多行代码,只是惯例,你不喜欢的话可以不遵守
2、{...} 的优先级要高于 do..end
例如:
p 3.times { 3 } #=> 3
p 3.times do
3
end #=> #<Enumerator: ...>
但是它们在你的例子中是没有区别的。你上面的代码
class_evel do
code
end
同样是不能实现生成 getter 和 setter 的目的的。 建议楼主找本 ruby 的书把一些基本概念(尤其是 block)好好看看。
把你的production.rb
发出来看一下。
你的 @user
为空,你对它调用 .id
就会报这种错误了,log 里面说的挺清楚的呀:Called id for nil
楼主你果然混乱了,看下面的代码:
class Parent
end
class Child < Parent
end
Child.superclass #=> Parent
Parent.class #=> Class
如你所问:Child 的父类是 Parent,那 Parent.class 就应该是 Parent ? 完全不明白你在想什么了。
顶一下。
没有待遇。。。。
rails guide : association http://guides.rubyonrails.org/association_basics.html; query interface: http://guides.rubyonrails.org/active_record_querying.html
如果用的 ruby 版本是 1.9.* 到这里https://rvm.io/packages/readline/去按照说明安装 readline 之后就好了
硬着头皮看英语吧,英语这关是绕不过的。
class MyClass
def greet_with_log
puts "Calling method..."
greet_without_log
puts "...Method called"
end
def great
puts 'Hello!'
end
alias_method :greet_without_log, :greet
alias_method :greet, :greet_with_log
end
MyClass.new.greet
⇒
Calling method...
Hello!
...Method called
alias_method :greet_without_log, :greet
这句代码使得greet_without_log
等同于greet
;
而alias_method :greet, :greet_with_log
这句则又使得greet
等同于了greet_with_log
;
所以这时候你再调用greet
时就相当于调用了greet_with_log
了,至于在greet_with_log
内部由于greet_without_log
此时是等价于之前的greet
的,所以调用时输出的是'Hello'
;
这里需要说明的一个问题是:
调用alias
或者alias_method
的实质其实是将原有的Method
对象(greet
变量所指向的)复制了一份,生成一个匿名的Method
对象,然后将该对象赋值个变量greet_without_log
;
简单的说就是在ruby
中一切皆为对象,方法也不例外,方法名实质上是一个变量,它的值就是对应的Method
对象。
先看下面的代码:
greet = 1
greet_with_log = 2
greet_without_log = greet
greet = greet_with_log
p greet #=> 2
p greet_without_log #=> 1
可以说从实质上来时上面的代码和你给出的代码是没有区别的,仅仅是吧上面的数字换成Method
对象而已。
另外强烈建议楼主下次发帖时格式化代码,没格式化的代码看着太难受了。
#15 楼 @lin_style 看不懂你说的是什么意思。“现在这些 ACTION 登陆和不登陆都可以做,那具体的权限只能到具体的 ACTION 函数里面判断。比如在 ACTION 里取到@user 信息做一些判断什么的。现在则要在 ACTION 里面判断是否有这个@user ,然后做对应的事情。”里面“这些 action”指的是那些 action?为甚么用两个 filter 的话:"那具体的权限只能到具体的 ACTION 函数里面判断"?
#5 楼 @lin_style 用两个filter
会比较好:
before_filter find_user, :only => [:a, :b, :c, :d]
before_filter authenticate_user, :only => [:c, :d]
private
def find_user
@user = User.find_by_id(session[:user_id])
end
def authenticate_user
@user and redirect_to(:controller=>"welcome",:action => "index")
end
另外建议楼主下次提问时吧代码格式化一下,方便大家看。
可以试着把不要 DB 下能跑的页面缓存起来呀,比如做一个 page_cache。
#6 楼 @miclle http://pow.cx/manual#section_4 这里有介绍了几个好用的第三方插件,你可以试一下。