如何作邀请码注呢?

44 views
Skip to first unread message

G.zhen.ning

unread,
Jun 13, 2009, 3:31:56 AM6/13/09
to shangha...@googlegroups.com
 想通过生成邀请码,然后让有邀请码的用户才能注册。于是我在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,但感觉不是我所需的.

Jan

unread,
Jun 13, 2009, 4:21:04 AM6/13/09
to shangha...@googlegroups.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,但感觉不是我所需的.
>

> --~--~---------~--~----~------------~-------~--~----~
> --~--~---------~--~----~------------~-------~--~----~
> 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)

Daniel Lv

unread,
Jun 13, 2009, 4:20:46 AM6/13/09
to shangha...@googlegroups.com
你用了restful_authentication这个插件了么?
为什么不能用get请求+url参数呢?就跟restful_authentication中的激活account邮件中的url一样来处理.
http://host:port/users/new?invitation_code=your_unique_code

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

unread,
Jun 13, 2009, 4:59:03 AM6/13/09
to shangha...@googlegroups.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,但感觉不是我所需的.
>
> >

Daniel Lv

unread,
Jun 13, 2009, 5:36:19 AM6/13/09
to shangha...@googlegroups.com
这样的话,Xie的方法是对的...
Xie的意思是两个表单,一个是invitaion_code提交表单,在提交后验证code是否正确,正确则redirect_to
new_user_path,错误就转向invitation_code的验证错误页面...

2009/6/13 G.zhen.ning <g.zhe...@gmail.com>:

unread,
Jun 14, 2009, 1:38:56 AM6/14/09
to Shanghai on Rails
我觉得没必要执着一定要用post方法.

你可以在用户输入 邀请码 后,用js在页面上生成一个 类似 Daniel lv同学给URL :
http://host:port/users/new?invitation_code=your_unique_code

然后当用户点击提交按钮时,跳转到你生成的这个URL,不就可以了吗?

这样你的new方法就不用处理post方法啦.

Yi Tan

unread,
Jun 14, 2009, 2:50:32 AM6/14/09
to shangha...@googlegroups.com
Try:

map.resources :users, :member => { :new=>:post }

This will generate routes:

#            new_user GET    /users/new(.:format)                {:controller=>$
#                     POST   /users/:id/new(.:format)            {:controller=>$

这样的话,你的invitation path 可以写成

new_user_path(invitation_code)
产生地址:
http://host:port/users/your_unique_code/new

所以在你的action中可以这么写

@user = User.find_by_activition_code(params[:id])

unless @user.nil?
# create user
else
# display error msg
end

Regards,

ty


2009/6/14 欢 <yzh...@gmail.com>
map.resources: users

Jan

unread,
Jun 14, 2009, 10:38:58 AM6/14/09
to shangha...@googlegroups.com
* Daniel Lv <lgn...@gmail.com> [2009-06-13 17:36:19 +0800]:

> 这样的话,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)

Jan

unread,
Jun 14, 2009, 10:43:29 AM6/14/09
to shangha...@googlegroups.com
* 欢 <yzh...@gmail.com> [2009-06-13 22:38:56 -0700]:

> 我觉得没必要执着一定要用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,但感觉不是我所需的.

Hozaka.Guo

unread,
Jun 15, 2009, 2:39:24 PM6/15/09
to Shanghai on Rails
处理邀请、验证、激活之类的问题上,我的原则是:绝对不用除了GET以外的方法。为什么呢,从实际情况考虑一下,A邀请B,那么是给B一个邀请码,让B
复制,然后到网站上找个框再粘贴(当然,别忽略了B是要花多少时间在邮件中发现这个邀请码),还是说直接给一个URL,点过去就OK。这是第一点,从
UE角度考虑。

第二点,关于验证码的载体,总不见得是发小纸片吧?最行之有效的方法还是通过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方法添加一句

Hozaka.Guo

unread,
Jun 15, 2009, 2:42:08 PM6/15/09
to Shanghai on Rails
我发现 google groups 里面发言,每按一次 backspace 删除都会产生额外的换行,应该算个bug......

@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方法添加一句

Dingding Ye

unread,
Jun 15, 2009, 2:46:32 PM6/15/09
to shangha...@googlegroups.com
+1

能直接点的就直接GET。POST一不友好,二还要skip authenticity verification,

2009/6/16 Hozaka.Guo <hoz...@gmail.com>

G.zhen.ning

unread,
Jun 17, 2009, 1:13:55 AM6/17/09
to shangha...@googlegroups.com
谢谢大家的意见,挺有思考性的.

2009/6/16 Dingding Ye <yedin...@gmail.com>

ashchan

unread,
Jun 22, 2009, 7:18:45 AM6/22/09
to Shanghai on Rails
我也同意Hozaka,如果是验证码或邀请吗,应该尽是用get(或是get与post均接受),毕竟很多场景下这种URL是要通过邮件或其他方式传播
的(当然你的应用可能限制了必须用这种方式)。

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>

Reply all
Reply to author
Forward
0 new messages