我在routes.rb文件中有以下代码。
resources :users do
member do
get :following,:followers
end
collection do
put :activate_email
end
end
我有一个像这样的用户电子邮件激活链接:
<%= link_to "Activate",activate_email_users_url(email_token: @user.email_token),method: :put %>
当我点击激活链接时,这是生成的网址
http://localhost:3000/users/activate_email?email_token=WWNvMN-r_lXgovrQiDlSSQ
更新:好的,我想我知道问题是什么。当我在我的Gmail中查看包含link_to的激活电子邮件的html源时,没有
data-method='put'。所以这似乎是问题所在。它总是发送默认的GET请求而不是PUT。 这是我的user_mailer / registration_confirmation.html.erb文件
<%= javascript_include_tag "application" %>
</head>
请单击以下链接激活您的电子邮件 &lt;%= link_to“Activate”,activate_email_users_url(email_token:@ user.email_token),method :: put%&gt;
这会出现以下错误:
undefined method `protect_against_forgery?' for #导致此错误。有没有办法解决这个问题?So , the code <%= javascript_include_tag "application" %>
答案 0 :(得分:4)
抱歉,我不知道你的目的,但显然你有一个激活用户的目的。 试试这个,如果这个解决方案不起作用,请告诉我你在控制器上的动作(activate_email)!
见rake routes
输出:
activate_email_users PUT /users/activate_email(.:format) users#activate_email
user GET /users/:id(.:format) users#show
生成时
http://localhost:3000/users/activate_email?email_token=WWNvMN-r_lXgovrQiDlSSQ
您的问题activate_email
被认为是:id
users/activate_email => users/:id
解决问题的方法:
尝试从链接中删除method
。最好在路由文件中指定method
。如何通过放入路线替换匹配:
resources :users do
member do
get :following,:followers
end
end
put "/users/activate_email/:email_token" => "users#activate_email", :as => "activate"
并在视图上
<%= link_to "Activate", activate_path(:email_token => @user.email_token) %>
我没有测试过这个,但我想这就足够了。
<强>更新强>
问题的:未定义的方法`protect_against_forgery?'
将此添加到只有您的邮件程序模板使用的帮助程序:
def protect_against_forgery?
false
end
注意:如果您有新问题,请创建新的“提问”,并且对此问题有用的答案
答案 1 :(得分:0)
如果您尝试激活单个用户帐户,则可能不希望在集合上指定路径(您将用于对多个用户执行操作的路径)。
这里有一些(未经测试的)代码应该指向正确的方向:
controller :users do
put '/activate/:email_token', :to => :activate, :as => 'activate_email'
end
哪个应该将PUT路由到/activate/xxxx
到UsersController#activate
操作,params[:email_token]
设置为xxxx
。它还应该为您提供#activate_email_url
路由,您可以传递激活令牌(您可以通过在命令行上运行rake routes
来检查应用程序提供的路由)。
答案 2 :(得分:0)
即使我的问题与将模板呈现为字符串而不只是在浏览器中有关,Google仍将我重定向到这个问题。对于模板问题,我的解决方案是遵循以下原则:
action_controller = ActionController::Base.new()
action_controller.class_eval do
def protect_against_forgery?
false
end
end
file_string = action_controller.render_to_string('/some_template/template_file',locals: { local_variable: 1 }