我的目标是让管理员有权为用户签署项目。
目前,用户可以自行注册项目。
所以我想是为了让管理员这样做..做这样的事情:
HAML
= link_to "Project Signup", card_signups_path + "?user=#{user.id}", :class => "button"
并传递params [:user]所以我可以用这个替换这个控制器:
if params[:user]
@card_signup = User.find(params[:user]).build_card_signup
else
@card_signup = current_user.build_card_signup
end
麻烦的是..这是一个3部分的注册过程,它加载了VIA AJAX,所以我不能在第一个之后的任何步骤中传递?user=#{user.id}
..(至少不是与我已经做过的相同的惯例,或者知道如何)
你会采用什么样的策略?
答案 0 :(得分:1)
实现此目的的一种可能方法是在表单中添加隐藏字段,以反映传入的参数(如果找到)。
因此,如果您传入的参数是用户,则在视图中添加隐藏字段,例如:
<input type="hidden" name="user" and value="<%= params[:user] %>" />
或使用rails形成帮助器:
hidden_field_tag 'user', params[:user]
这样,控制器中的代码可以在接收端的每一步检查此参数,并知道保存对象的对象。像这样:
def create
@card_signup = CardSignup.new(params[:card_signup])
if params[:user] && params[:user].to_i > 0
##
##some logic here to make sure current_user is admin, as no one else is allowed to do this
##
@card_signup.user_id = params[:user]
else
@card_signup.user_id = current_user.id
end
##onto validating model and saving / redirecting / etc
end
但这里的最终目标是保持用户参数,无论是页面的初始GET参数,还是来自ajax /等的Put / Post提交表单,这个参数都将在。
要检查的另一个安全角度也可以在此控制器的“新”操作中,并检查是否存在用户参数,则current_user是管理员,否则重定向或显示错误消息。这与在创建时重新验证这一点相结合应该提供一种确定没有其他人可以提出这些请求的正当方法。你也可以将它放在before_filter中,只调用new和create来保持干净。