我正在使用Devise 3.1.1和Rails 4
当用户点击自定义链接并且用户未登录时,我想在视图中预先填充电子邮件字段以获取自定义登录屏幕(会话中的值)。我有一个SessionsController方法,如下所示:
def new
# devise code seems to take this param, but it doesn't work
params[:sign_in] = { 'email' => session[:sharing_email] }
super
# This is too late as view is already rendered.
# I can put this in the view, but I'd rather do it in the controller
# resource.email = session[:sharing_email] if session[:sharing_email].present?
end
我应该把这一行放在视图中吗?它工作正常。
resource.email = session[:sharing_email] if session[:sharing_email].present?
在我打电话给超级电话之前有没有什么好办法让它进入我的控制器?注意,在调用super之前资源不存在。
答案 0 :(得分:1)
我需要做类似的事情,在查看了Devise源代码后,我最终使用了这样的东西:
def new
build_resource({email: session[:sharing_email]})
respond_with self.resource
end
答案 1 :(得分:0)
如果您想要所有用户的默认值,您可以将默认值分配给rails中的列。 如果您使用的是activerecord,请执行以下操作
create_table :users do |t|
t.string :email, :default => 'default@email.com'
...
t.timestamps
end
如果您想在控制器级别上使用它,那么在新操作中添加
@user = User.new(email: session[:sharing_email])
答案 2 :(得分:0)
我实际上只使用了Rails 3.2的设计。但是,参数清理程序(对于Rails< 4与4不同)看起来像Rails 4的期望是相同的 - 从设计3.1.2的parameter_sanitizer.rb中的代码判断,它看起来像它期望的标志-in hash在资源哈希中,而不是在你的例子中的顶层。
因此,如果您的资源始终是用户,那么您可以放弃:
params[:user][:sign_in] = { 'email' => session[:sharing_email] }
或更通用/正确,如:
params[resource_name.to_sym][:sign_in] = { 'email' => session[:sharing_email] }
应该工作(resource_name可能已经是一个符号;我不记得了)。 (编辑实际上是一个字符串而不是一个符号,我想是的,因为它是以HTML格式结束的方式 - 即一个名为user[email]
的输入。
它在视图中使用resource.email的事实使我更加确定在哈希中添加额外的资源级别可以解决您的问题。
答案 3 :(得分:0)
此外,您可以将电子邮件作为url param传递到登录页面,如下所示:
redirect_to user_session_path("user[email]" => "email@example.com")
或者,如果url是在rails之外生成的:
http://example.com/sign_in?user%5Bemail%5D=email%40example.com