> 想通过生成邀请码,然后让有邀请码的用户才能注册。于是我在user里创建了一个方法invite_code,本意是想在这里让用户输入邀请码,然后post过去user控制器new方法,在new方法添加一句
> unless @invide.nil?的代码来检证此邀请码是否有效,无效就跳转不让注码.
>
> 问题出在,map.resources: users后,new方法是不接受post请求的,那么有方法让new方法也接受post请求么?
invite_code post给自己,如果邀请码有效则redirect_to :new?
Jan
>
> 其它的解决方法.
> 1,在new方法里让用户输入邀请码,然后用另外一个方法来代替原先的new方法,最后传给create方法创建用户。
> 2, acts_as_machine,来创建一个wizard。(但我的是小应用,感觉没需要这样是吧。
>
>
> 补充:我看了railscast的那个beta invitation,但感觉不是我所需的.
>
> --~--~---------~--~----~------------~-------~--~----~
> --~--~---------~--~----~------------~-------~--~----~
> Shanghai Ruby&Rails 爱好者论坛是一个非营利的民间组织,它旨在为Ruby&Rails爱好者提供一个自由,开放的交流平台,论坛每季度举行一次大型会议,会议的所有费用由赞助商支付,来宾不需交纳任何费用。
> We push the china ruby&rails community forward!!
> Shanghai Ruby&Rails的邮件列表地址是 shangha...@googlegroups.com
> 要了解更多详情,请访问 http://groups.google.com/group/shanghaionrails?hl=en?hl=en
> 退订请发送mail到 shanghaionrai...@googlegroups.com
> --~--~---------~--~----~------------~-------~--~----~
> -~----------~----~----~----~------~----~------~--~---
>
--
jan=callcc{|jan|jan};jan.call(jan)
class Users < AR
attr_accessor :invitation_code
end
在new页面的form表单中置入一个hidden_field, named as invitation_code
然后添加一个自定义的validation用来验证这个invitation_code...
2009/6/13 G.zhen.ning <g.zhe...@gmail.com>:
* G.zhen.ning <g.zhe...@gmail.com> [2009-06-13 15:31:56 +0800]:
invite_code post给自己,如果邀请码有效则redirect_to :new?
> 想通过生成邀请码,然后让有邀请码的用户才能注册。于是我在user里创建了一个方法invite_code,本意是想在这里让用户输入邀请码,然后post过去user控制器new方法,在new方法添加一句
> unless @invide.nil?的代码来检证此邀请码是否有效,无效就跳转不让注码.
>
> 问题出在,map.resources: users后,new方法是不接受post请求的,那么有方法让new方法也接受post请求么?
Jan
>
> 其它的解决方法.
> 1,在new方法里让用户输入邀请码,然后用另外一个方法来代替原先的new方法,最后传给create方法创建用户。
> 2, acts_as_machine,来创建一个wizard。(但我的是小应用,感觉没需要这样是吧。
>
>
> 补充:我看了railscast的那个beta invitation,但感觉不是我所需的.
>
> >
2009/6/13 G.zhen.ning <g.zhe...@gmail.com>:
你可以在用户输入 邀请码 后,用js在页面上生成一个 类似 Daniel lv同学给URL :
http://host:port/users/new?invitation_code=your_unique_code
然后当用户点击提交按钮时,跳转到你生成的这个URL,不就可以了吗?
这样你的new方法就不用处理post方法啦.
> 这样的话,Xie的方法是对的...
> Xie的意思是两个表单,一个是invitaion_code提交表单,在提交后验证code是否正确,正确则redirect_to
> new_user_path,错误就转向invitation_code的验证错误页面...
yes. 把验证验证码的逻辑放在invitation_code而不是new里面
Jan
>
> 2009/6/13 G.zhen.ning <g.zhe...@gmail.com>:
> > Daniel,
> > 我要的效果是先让用户看见一个输入框,如何输入的是错误的代码就没显示用户输入的表单了,照你上面的做的,效果应该是用户输入资料后,如何带的code是错误的,然后才会显示出code错误的提示。让用户白输入许多东西了,况且许多人还是没code的,有可能只是乱撞。
> >
> > Xie,
> > 之所以要在new方法里接收post的数据,就是为了检验是否可以执行new这个action,直接post给自身,这也没解决new方法如何检证是否输入了code的用户是吧?简单的就是说,如何控制new方法的执行呢?protectd和private都不适用。。。
> >
> > 当然,我是新手,如果说的话有错,希望大家坦率指正,共同进步。
> >
> > 2009/6/13 Jan <jan....@gmail.com>
> >>
> >> * G.zhen.ning <g.zhe...@gmail.com> [2009-06-13 15:31:56 +0800]:
> >>
> >> >
> >> > 想通过生成邀请码,然后让有邀请码的用户才能注册。于是我在user里创建了一个方法invite_code,本意是想在这里让用户输入邀请码,然后post过去user控制器new方法,在new方法添加一句
> >> > unless @invide.nil?的代码来检证此邀请码是否有效,无效就跳转不让注码.
> >> >
> >> > 问题出在,map.resources: users后,new方法是不接受post请求的,那么有方法让new方法也接受post请求么?
> >>
> >> invite_code post给自己,如果邀请码有效则redirect_to :new?
> >>
> >> Jan
> >>
> >> >
> >> > 其它的解决方法.
> >> > 1,在new方法里让用户输入邀请码,然后用另外一个方法来代替原先的new方法,最后传给create方法创建用户。
> >> > 2, acts_as_machine,来创建一个wizard。(但我的是小应用,感觉没需要这样是吧。
> >> >
> >> >
> >> > 补充:我看了railscast的那个beta invitation,但感觉不是我所需的.
> >> >
> >> > >
> >>
> >> --
> >> jan=callcc{|jan|jan};jan.call(jan)
> >
> >
> > >
> >
>
> --~--~---------~--~----~------------~-------~--~----~
> --~--~---------~--~----~------------~-------~--~----~
> Shanghai Ruby&Rails 爱好者论坛是一个非营利的民间组织,它旨在为Ruby&Rails爱好者提供一个自由,开放的交流平台,论坛每季度举行一次大型会议,会议的所有费用由赞助商支付,来宾不需交纳任何费用。
> We push the china ruby&rails community forward!!
> Shanghai Ruby&Rails的邮件列表地址是 shangha...@googlegroups.com
> 要了解更多详情,请访问 http://groups.google.com/group/shanghaionrails?hl=en?hl=en
> 退订请发送mail到 shanghaionrai...@googlegroups.com
> --~--~---------~--~----~------------~-------~--~----~
> -~----------~----~----~----~------~----~------~--~---
>
--
jan=callcc{|jan|jan};jan.call(jan)
> 我觉得没必要执着一定要用post方法.
>
> 你可以在用户输入 邀请码 后,用js在页面上生成一个 类似 Daniel lv同学给URL :
> http://host:port/users/new?invitation_code=your_unique_code
>
> 然后当用户点击提交按钮时,跳转到你生成的这个URL,不就可以了吗?
>
> 这样你的new方法就不用处理post方法啦.
是的,这样也是把验证逻辑分离出了new方法
用JS甚至可以把提交按钮都省了 用onchange()方法向服务器发送数据,一旦验证码正确
输入就redirect到new页面
不过为了让noscript的用户也能正常访问,还是需要一个非ajax的版本 :)
Jan
>
> On 6月13日, 下午3时31分, "G.zhen.ning" <g.zhen.n...@gmail.com> wrote:
> > 想通过生成邀请码,然后让有邀请码的用户才能注册。于是我在user里创建了一个方法invite_code,本意是想在这里让用户输入邀请码,然后post过去user控制器new方法,在new方法添加一句
> > unless @invide.nil?的代码来检证此邀请码是否有效,无效就跳转不让注码.
> >
> > 问题出在,map.resources: users后,new方法是不接受post请求的,那么有方法让new方法也接受post请求么?
> >
> > 其它的解决方法.
> > 1,在new方法里让用户输入邀请码,然后用另外一个方法来代替原先的new方法,最后传给create方法创建用户。
> > 2, acts_as_machine,来创建一个wizard。(但我的是小应用,感觉没需要这样是吧。
> >
> > 补充:我看了railscast的那个beta invitation,但感觉不是我所需的.
第二点,关于验证码的载体,总不见得是发小纸片吧?最行之有效的方法还是通过email,那么就不得不考虑web mail以及浏览器的安全设置。前者
90%会过滤掉页面中的js,甚至只以 text/plain 方式打开;后者更大了去了,可以禁用js,可以这个可以那个,要知道浏览器总是可以
很"安全"的。
综上,GET方法才是一个好的解决方案,这也是为什么现在满大街的URL都带token。
在这个基础上,再来考虑你的实际问题,无非就是要用户有合法的邀请码才给注册。假设邀请的入口形如 http://example.com/signup?invitation=a9e3b2
def new
if User.valid_invitation_token?(params[:invitation_token])
render # just render the form
else
# set flash notice, redirect to homepage, even return 404
end
end
再深入一些,如果要求记录每个用户被谁邀请,可以在new和create方法中查出来;如果要代码好看些,做个
before_filter :find_inviter, :only => [:new, :create],等等,就不一一列举了。
TIPS: Do not forget to pass the invitation token via hidden field in
signup form cause "create" action need it to find out the inviter
user.
On Jun 13, 3:31 pm, "G.zhen.ning" <g.zhen.n...@gmail.com> wrote:
> 想通过生成邀请码,然后让有邀请码的用户才能注册。于是我在user里创建了一个方法invite_code,本意是想在这里让用户输入邀请码,然后post过 去user控制器new方法,在new方法添加一句
@Safari 3 & 4, Firefox? IE?
On Jun 13, 3:31 pm, "G.zhen.ning" <g.zhen.n...@gmail.com> wrote:
> 想通过生成邀请码,然后让有邀请码的用户才能注册。于是我在user里创建了一个方法invite_code,本意是想在这里让用户输入邀请码,然后post过 去user控制器new方法,在new方法添加一句
POST并不能保证邀请吗是用户手工输入的,所以用这个来判断是不够的。
另外,即便你在invite_code action里处理了判断邀请码的逻辑,在create里还是要判断这个的吗?我猜想在new里,一般会以
hidden field的方式把邀请码保存下来以传递给create。那么如果你new里得到了正确的值,但这个值在传递给create之前被撰改
了,create里还是需要错误处理。我这样描述可能有点绕,我的意思是,如果是这种情况,为何不单独用一个new,上面可以让用户输入邀请码,然后判
断的逻辑直接放在create里呢(换句话说,create是个原子操作,必须要有正确的邀请码)?
当然如果觉得这样对用户太不友好(如让用户输入了太多内容后发现因为没有邀请码而无法注册),可以在new view上用ajax调用
check_invite_code进行实时判断和反馈(不过在create里仍要再判断一变)。
On Jun 17, 1:13 pm, "G.zhen.ning" <g.zhen.n...@gmail.com> wrote:
> 谢谢大家的意见,挺有思考性的.
>
> 2009/6/16 Dingding Ye <yedingd...@gmail.com>