相当好!!!明天上班开始学!!
#18 楼 @huacnlee 试了一下,验证码很好很漂亮,但……
我怎么判断提交过来的值对不对呢……
找到了验证的方法:
if captcha_valid?(params[:captcha])
p "~~~~~~~~~~~~~~~~~~~~"
end
但有一个奇怪的问题,就是这个验证老是不对,后来开 Firebug 查了一下,发现 它会一次产生两个码,生效的是我看不见的这个 (标 2 的那个) 我的 html.erb 文件如下:
<h1>Login111#login</h1>
<p>Find me in app/views/login/login.html.erb</p>
<form>
<p><%= captcha_tag %></p>
<p><%= text_field_tag :captcha %></p>
<p><%= submit_tag 'Validate' %></p>
</form>
controller 就没什么了:
class LoginController < ApplicationController
def login
if captcha_valid?(params[:captcha])
p "~~~~~~~~~~~~~~~~~~~~"
end
end
end
跪求解……
终于搞定了!
起因是 263 客服问我要报错信息……我一楞,这没有报错信息啊,就是不成功啊。于是去 google,找到了这个:
http://api.rubyonrails.org/classes/ActionMailer/Base.html
raise_delivery_errors
- Whether or not errors should be raised if the email fails to be delivered.
这不就是报错信息么?于是加上:
ActionMailer::Base.smtp_settings = {
#略
}
ActionMailer::Base.raise_delivery_errors = true
运行,果然有报错了,是
Net::SMTPAuthenticationError: 535 Error: authentication failed
这就好办了,我们来找什么是 535……其实也不用找,就是认证失败嘛=_=
然后看到这句:
:domain
- If you need to specify a HELO domain, you can do it here.
我的 domain 写的是 etsc-tech.com,也就是我们公司域名,但我记得那天用 telnet 调试的时候不是这个结果,果断弄出 telnet 再试:
helo a
250 263.net
果然就应该是这个吧!先改,再试,但……依然不成。还是看 API
:authentication
- If your mail server requires authentication, you need to specify the authentication type here. This is a symbol and one of :plain
(will send the password in the clear), :login
(will send password Base64 encoded) or :cram_md5
(combines a Challenge/Response mechanism to exchange information and a cryptographic Message Digest 5 algorithm to hash important information)
几种认证方式:plain,直接传递;login,Base64 码传递;cram_md5,md5 加密传递 那天的教程里我记得是 Base64 过的,于是先在 telnet 里试,用户名 terry,密码 xxxxx……同样 535 错误!又看那天的 telnet 教程,原来用户名也不应该是我的用户名,而是 [email protected] 这样的全名(这就是所有企业邮箱都失败的原因所在吧!) 改正后在 telnet 里调试,通过。 然后在 Rails 配置里写,通过! 完整代码:
ActionMailer::Base.smtp_settings = {
:address => "smtpcom.263xmail.com",#263提供的
:port => 25,#同上
:domain => "263.net",#263的客服说用我们公司的域名,其实他们乱说的,应该是在telnet里helo出来的那个域名
:user_name => "[email protected]",#上面不用我们公司的域名了,所以这里要加上,因为是企业邮箱嘛
:password => "password",
:authentication => "login"#三种方式上面有解释
}
ActionMailer::Base.raise_delivery_errors = true#这个调试完倒是可以不要了……
打完收工…… 附一个更详细的 telnet 发邮件步骤: http://www.wikihow.com/Send-Email-Using-Telnet
和 LZ 类似,QQ 免费 163 免费 gmail 免费都无问题,263 企业邮箱发不出去……莫非是企业邮箱就不行咩…………
好吧,是怎么执行起来的我还真不知道……似乎是重启服务似乎又不是,反正现在它正在连续发邮件中…… 关键是我理解错误,这个脚本写完后是不用“执行”的,因为这个是直接写进系统的 crontab 里了,系统自己会执行之。
我也是跟 LZ 类似的问题:
schedule.rb 里我是这么写的:
set :environment, :development
every 1.minutes do
rake "terry:mail_test"
end
然后 terry.rake 文件是:
#encoding: UTF-8
namespace :terry do
desc '发邮件测试'
task :mail_test => :environment do
UserMailer.welcome_email(User.find(1)).deliver
puts "XXX"
end
end
单独在命令行里执行rake "terry:mail_test"
是没问题的,邮件收到,但我执行 whenever 就报这个:
terry@TerryUbuntu:~/RubymineProjects/EIMV5$ whenever
* * * * * /bin/bash -l -c 'cd /home/terry/RubymineProjects/EIMV5 && RAILS_ENV=development bundle exec rake terry:mail_test --silent'
## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.
## [message] Run `whenever --help' for more options.
terry@TerryUbuntu:~/RubymineProjects/EIMV5$
我哪怕执行了一个whenever --update-crontab
也不行。求解……
#16 楼 @diudiutang 借地方问问,如何限制发送频率呢?比如我发完一封邮件后等 20 秒,真的用 sleep 20 吗?
ActionMailer::Base.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:domain => 'gmail.com',
:user_name => 'username',
:password => 'password',
:authentication => 'plain',
:enable_starttls_auto => true
}
这是 Gmail 的,也成了。决定再跟 263 的技术客服沟通一下…………
ActionMailer::Base.smtp_settings = {
:address => "smtp.qq.com",
:port => 25,
:domain => "qq.com",
:user_name => "username",
:password => "password",
:authentication => "plain"
}
QQ 的这么试无误,关键是不能要
:enable_starttls_auto => true
这句,true false 都不要,根本不要这句……
可是 263 的还是不成…………
ActionMailer::Base.smtp_settings = {
:address => "smtp.qq.com",
:port => 25,
:domain => "qq.com",
:user_name => "username",
:password => "password",
:authentication => "plain"
}
QQ 的这么试也成了,关键是不能要
:enable_starttls_auto => true
这句,true false 都不要,根本不要这句……
还真不是这句的原因。我用我的 QQ 号试,加上了这句话,成功了,但用另外一个 QQ 号试就不成,无论有没有这句话都不成……这还有什么花巧么……………………
原来是 QQ 邮件的设置,一个开通了 POP3/SMTP服务 和 IMAP/SMTP服务 这两项,就不行,另外一个只开通了 POP3/SMTP服务 这一项,就成功了。
可是 263 的还是不成…………
在家又试了试这个http://www.kongtechnology.com/2008/01/27/smtp-authentication-and-send-emails-using-telnet/
成功发送。
是不是说我能用 telnet 这么发邮件,就说明我可以用 Rails 发呢?
我在它的这个步骤里 login 了,所以我也必须把
:authentication => "plain"
设置成 login 对吗?
家里没 Rails,明天去公司试。权当备忘了……
呃,提供一个企业邮箱的测试账号吧:
:domain => "etsc-tech.com",#这个问过263的人,说就是写我们公司的域名
:user_name => "test",
:password => "1234qwerQWER",
web 方式登录邮箱查看已发邮件用 www.263.net,然后用户名 [email protected],密码如上,不勾“安全登录” 哪位大侠能帮我看看不……
现在是 MySQL 开通不了,报错如下: name: VmcError, endpoint: POST:/services, statusCode: 502, code: 503, description: Unexpected response from service gateway
最近投奔了 RubyMine,确实很好用,各种补全用着很舒服,一些小功能也不错:多剪贴板、生成模型结构图、快速导航等等
装倒是没啥大问题,但貌似不能输入中文有点变态……
求教程……
同建议新建 migration,将 schema 的内容拷进去。
然后再怎么迁移 schema 文件呢?
求靠谱 Ruby 缩进工具……
#12 楼 @jimrokliu 嗯,昨天发了帖之后就自己搜到了这个,和另外一个 resque-schedule,看起来都不错,试试去。
#7 楼 @jimrokliu 我实在是太愚钝了,想自己加一个“departments_users”,写了半天也没成功,说我关联太复杂……
class User < ActiveRecord::Base
#作为用户所属的部门们
has_many :departments_users
has_many :departments, :through => :departments_users
#作为用户的部门经理们
has_many :departments_managers,:through => :departments
#作为经理管辖的用户们,不过似乎不是这么写的=_=
has_many :departments_users, :through => :departments
end
class Department < ActiveRecord::Base
#部门的用户们
has_many :departments_users
has_many :users, :through => :departments_users, :source => :user
#部门的经理们
has_many :departments_managers
has_many :managers, :through => :departments_managers, :source => :user
end
class DepartmentsManager < ActiveRecord::Base
belongs_to :department
belongs_to :user
end
class DepartmentsUser < ActiveRecord::Base
belongs_to :department
belongs_to :user
end
然后报错:
[1] pry(main)> u=User.find(2)
=> #<User id: 2, reg_name: "marian", name: "王小丽", name_en: "Marian Wang", email: "[email protected]", hashed_password: nil, salt: nil, status: 1, extension: "814", mobile: nil, qq: nil, msn: nil, created_at: "2012-07-28 04:01:17", updated_at: "2012-07-28 04:01:17">
[2] pry(main)> u.departments_managers
SystemStackError: stack level too deep
from /home/terry/.rvm/gems/ruby-1.9.3-p194/gems/pry-0.9.9.6/lib/pry/pry_instance.rb:249
不能两个关联 through 同一个类吗?这个 through 和 source,哪里有详细的讲解啊,实在是不懂了……
要真的 Rails 轮询应该怎么弄呢?比如每到周一就发邮件
#7 楼 @jimrokliu 确实可行,虽然数据取出来是 [1,3,3,5] 这样子的……我 uniq 一下好了。我再仔细琢磨琢磨原理,大感谢!
#3 楼 @jimrokliu 不行啊老大,报错:
[1] pry(main)> u=User.find(2)
=> #<User id: 2, reg_name: "marian", name: "王小丽", name_en: "Marian Wang", email: "[email protected]", hashed_password: nil, salt: nil, status: 1, extension: "814", mobile: nil, qq: nil, msn: nil, created_at: "2012-07-28 04:01:17", updated_at: "2012-07-28 04:01:17">
[2] pry(main)> u.directs
ActiveRecord::HasManyThroughSourceAssociationNotFoundError: Could not find the source association(s) :user in model Department. Try 'has_many :directs, :through => :departments, :source => <name>'. Is it one of :departments_users, :users, :departments_managers, or :managers?
from /home/terry/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.0/lib/active_record/reflection.rb:509:in `check_validity!'