默认情况下,邀请邮件的主题是
mailer:
invitation_instructions:
subject: 'Invitation instructions'
Run Code Online (Sandbox Code Playgroud)
我想改成它
subject: '%{invited_by} has invited you!'
Run Code Online (Sandbox Code Playgroud)
但是这需要让i8n的translate方法可以访问invite_by变量.
如何在不更改默认行为的情况下访问/声明此变量?
ruby-on-rails actionmailer devise rails-i18n devise-invitable
我创建了一个自定义设计邮件程序来更改视图中Devise电子邮件模板的位置.我做了以下更改:
#/config/initializers/devise
config.mailer = 'CustomDeviseMailer'
Run Code Online (Sandbox Code Playgroud)
和
# app/mailers/customer_devise_mailer.rb
def headers_for(action, opts)
headers = {
:subject => translate(devise_mapping, action),
:from => mailer_sender(devise_mapping),
:to => resource.email,
:template_path => '/mailers/devise'
}.merge(opts)
end
Run Code Online (Sandbox Code Playgroud)
现在我的电子邮件模板位于:/ app/views/mailers/devise /
问题是当一个Devise Invitable .invite!发出呼叫,电子邮件的主题行说明错误:" translation missing: en.#<Devise::Mapping:0x007fe8fb6f4578>
".
我怀疑我需要对/config/locales/devise_invitable.en.yml
文件进行调整.我也用/app/controllers/invitations_controller.rb
.覆盖了Devise Invitable控制器.
我应该对devise_invitable.en.yml
文件做什么补充?谢谢.
例如,当我去时users/invitations/new
,唯一的领域是:email
.我想邀请一位用户,除了提供他们的电子邮件外,还提供:
user belongs_to company
)我创建了Users::InvitationsController < Devise::InvitationsController
:
class Users::InvitationsController < Devise::InvitationsController
private
def resource_params
params.permit(user: [:email, :invitation_token, :role, :company_id])[:user]
end
end
Run Code Online (Sandbox Code Playgroud)
我把这些字段添加到了users/invitations/new
.邀请发送正常,但是当我接受它并输入密码时,我的验证失败了No role is selected
(b/c验证).
如何在发送邀请之前设置这些字段并将其保留并在接受邀请时保存?谢谢!
首先,原谅我可怜的英语,我是法国人......解释我的问题很棘手!
我在Rails应用程序中有一个模型用户模型:
class User < ActiveRecord::Base
attr_accessible :email, :gender, :lastname, :firstname
end
Run Code Online (Sandbox Code Playgroud)
以及从User继承的BackUser模型:
class BackUser < User
# Class for Backoffice User
devise :database_authenticatable,
:rememberable,
:trackable,
:lockable,
:invitable,
:confirmable,
:validatable,
:validate_on_invite => true
attr_accessible :password, :password_confirmation, :remember_me, :active, :role
validates :role, presence: true,
inclusion: ["admin", "normal"]
validates :gender, presence: true
validates :firstname, presence: true
validates :lastname, presence: true
def admin?
self.role == 'admin'
end
end
Run Code Online (Sandbox Code Playgroud)
第二节课应该在邀请之前验证记录!但是,当我使用控制台执行以下操作时:
u = BackUser.new
u.invite!
Run Code Online (Sandbox Code Playgroud)
"u"保存在数据库中,邀请被发送到空白电子邮件...
你知道我要做什么吗?
吃了很多!
我在 Rails 应用程序上安装了 devise_invitable 。创建新邀请工作正常。
我构建了一个视图来管理邀请列表,并创建了一个表单按钮以允许管理员删除未完成的邀请。这是代码:
<%= link_to "Cancel Invitation", remove_user_invitation_path(invitation_token: invited.invitation_token), confirm: "Are you sure?", class: 'btn btn-mini btn-danger' %>
Run Code Online (Sandbox Code Playgroud)
结果始终是错误“提供的邀请令牌无效!”
查看服务器日志,我看到类似以下内容:
Started GET "/invitation/remove?invitation_token=f4e26062f27c7cc32a60e2024b9dba2b1350abba" for 127.0.0.1 at 2013-10-28 15:07:44 -0700
Processing by Devise::InvitationsController#destroy as HTML
Parameters: {"invitation_token"=>"f4e26062f27c7cc32a60e2024b9dba2b1350abba"}
User Load (2.9ms) SELECT "users".* FROM "users" WHERE "users"."invitation_token" = '46488d68fb36387ec639d5d6b9749273b56561a944f76eeefb2f5294ea5225e6' LIMIT 1
Run Code Online (Sandbox Code Playgroud)
这表明删除方法不需要原始邀请令牌。(从安全角度我可以理解这一点。)
我应该将什么值传递给remove_user_invitation_path?
我正在使用Devise邀请函。通常,在邀请电子邮件中,会有一个链接将被邀请者重定向到sign_in页面,类似这样的网址
mywebsite.com/users/invitation/accept?invitation_token=J-azZ8fKtkuAyp2VZWQX
Run Code Online (Sandbox Code Playgroud)
该网址来自Invitation_instructions.html:
<p><%= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @token) %></p>
Run Code Online (Sandbox Code Playgroud)
现在,我想在控制器中返回邀请网址作为json响应,如下所示:
def invite
invitee = User.invite!({:email => email}, current_user)
accept_invitation_url = ....
render :json => accept_invitation_url
end
Run Code Online (Sandbox Code Playgroud)
任何想法如何在控制器中获取accept_invitation_url?谢谢!
我一直在关注Ryan Boland优秀的Rails多租户教程,但是遇到了devise_invitable.我在用...
Rails 4.1.5
devise 3.3.0
devise_invitable 1.3.6
Postgresql
Run Code Online (Sandbox Code Playgroud)
我在选定的子域(mysubdomain.lvh.me:3000)上创建了一个新帐户和用户/帐户所有者,我可以从中发送用户邀请.我在隐身Chrome会话中打开邀请链接,以确保我没有登录或有任何当前会话.点击邀请链接后,我被重定向到登录页面(mysubdomain.lvh.me:3000/users/sign_in)并看到一个闪光通知:"提供的邀请令牌无效!"
我正在使用一个非常简单的邮件程序视图(app/views/devise/mailer/invitation_instructions.html.erb)...
<%= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @token) %>
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我保证的@token使用,如所描述这里.
创建邀请后,我确认邀请令牌已保存到数据库中(在本例中为hey@test.com - d1801fd8df78bd8cd125d5d8091fdc6a72c8f8faf4136cb282d497ec612195e9).我已经确认这符合接受请求时邀请查找的令牌(见下面的跟踪).但是,它会重定向到用户登录页面而不是完成注册,并且还会在跟踪日志中显示"过滤器链暂停为:resource_from_invitation_token呈现或重定向".在此交易之后,用户最终仍未确认.
关于我在这里可能出现什么问题的任何想法?我在下面包括日志,我的应用程序控制器和我的设计配置......
以下是邀请创建的跟踪日志:
Started POST "/users/invitation" for 127.0.0.1 at 2014-09-07 01:28:33 +0800
Processing by Devise::InvitationsController#create as HTML
Parameters: {"utf8"=>"?", "authenticity_token"=>"BiIQ95wwdQz3CJ0+OoLOE9xHHvxhloHsRHrxsqf1D2Q=", "user"=>{"email"=>"hey@test.com"}, "commit"=>"Invite User"}
User Load (4.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
Account Load (0.4ms) SELECT "public"."accounts".* FROM "public"."accounts" WHERE "public"."accounts"."subdomain" = 'mysubdomain' LIMIT 1 …
Run Code Online (Sandbox Code Playgroud) ruby-on-rails multi-tenant devise ruby-on-rails-4 devise-invitable
我正在使用devise_invitable邀请用户加入应用程序,因为我想在电子邮件中添加自定义消息。所以我的代码看起来像这样。
#user.rb
attr_accessor :message
def self.invite(emails, message)
User.invite!({email: email}) do |user|
user.message = message
end
end
#here I am overriding devise_invitable method to send mails later
def send_devise_notification(notification, *args)
devise_mailer.send(notification, self, *args).deliver_later
end
#users_controller.rb
def invite_user
User.invite(params[:email], params[:message])
end
#invitation_instructions.html.erb
<% if @resource.message %>
<p><%= @resource.message %></p>
<% end %>
Run Code Online (Sandbox Code Playgroud)
当我只使用传递时,邮件上会显示消息,但是当我在邮件视图中使用nil中的delivery_later attr_accessor时。
如果再问两次,我深表歉意。因为已经问过这个问题,但是根本没有任何帮助:(
因此,问题部分是当我实现Invitable时 ,成功实现后,除destroy_user_registration之外,其他所有东西都可以正常工作。
<%= link_to user_registration_path(resource_name), method: :delete do %>
<span class="text">Delete My Account</span>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这是用户部分的routes.rb
devise_for :users, path: '', path_names: {
sign_in: 'login',
sign_out: 'logout',
sign_up: 'register',
password: 'reset',
edit: 'account'
}
Run Code Online (Sandbox Code Playgroud) 我正在使用devise_invitable
gem在我的应用程序中启用邀请以及设计rails 3应用程序.我有一个User
&Profile
模型.在User
,有一个role
列给出了用户类型.
现在,我想限制创建新邀请的功能仅限于管理员通过确定这个范围路线到devise/invitations#new
哪里user.role=='admin'
和打开其他人的路线.这样的事情
MyApp::Application.routes.draw do
devise_for :users, skip: [:registrations, :invitations]
as :user do
get 'users/edit' => 'devise/registrations#edit', as: 'edit_user_registration'
put 'users' => 'devise/registrations#update', as: 'user_registration'
# manually define alll devise_invitable routes, except devise/invitations#new
# accept_user_invitation GET /users/invitation/accept(.:format) devise/invitations#edit
# user_invitation POST /users/invitation(.:format) devise/invitations#create
# also the #accept route goes here
end
resource :profile, except: :destroy
authenticated :user, lambda {|u| u.role == "admin"} do
resources …
Run Code Online (Sandbox Code Playgroud) devise-invitable ×10
ruby-on-rails ×10
devise ×8
actionmailer ×2
ruby ×2
multi-tenant ×1
rails-i18n ×1
routes ×1
rubygems ×1