6

我的 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  %>

当我点击激活链接时,这是生成的 url

 http://localhost:3000/users/activate_email?email_token=WWNvMN-r_lXgovrQiDlSSQ

更新:好的,所以我想我知道问题是什么。当我在我的 gmail 中查看包含 link_to 的激活电子邮件的 html 源时,没有

数据方法='放'
. 所以这似乎是问题所在。它总是发送一个默认的 GET 请求而不是 PUT。这是我的 user_mailer/registration_confirmation.html.erb 文件

  <%= javascript_include_tag "application" %>
</head>

请点击以下链接激活您的电子邮件 <%= link_to "Activate",activate_email_users_url(email_token: @user.email_token), method: :put %>

这给出了以下错误:

未定义的方法“protect_against_forgery?” 为了 #

所以,代码 <%= javascript_include_tag "application" %>

导致此错误。有没有办法解决 ?


如果您尝试激活单个用户帐户,您可能不想在集合上指定您的路由(您将用于对多个用户进行操作的操作)。

以下是一些(未经测试的)代码,应该为您指明正确的方向:

controller :users do
    put '/activate/:email_token', :to => :activate,  :as => 'activate_email'
end

哪个应该将 PUT 路由到/activate/xxxx设置为. 它还应该为您提供一个可以传递激活令牌的路由(您可以通过在命令行上运行来检查您的应用程序提供了哪些路由)。UsersController#activateparams[:email_token]xxxx#activate_email_urlrake routes

4

3 回答 3

5

对不起,我不知道你的目的,但显然你有激活用户的目的。试试这个,如果这个解决方案不起作用,请告诉我你在控制器上的操作(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

注意:如果您有新问题,请创建新的“提问”,并且同意答案对这个问题很有用

于 2013-05-21T16:12:48.363 回答
0

谷歌将我重定向到这个问题,尽管我的问题与将模板渲染为字符串有关,而不仅仅是在浏览器中。我对模板问题的解决方案是这样的:

  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 }
于 2019-06-24T15:20:01.373 回答
0

如果您尝试激活单个用户帐户,您可能不想在集合上指定您的路由(您将用于对多个用户进行操作的操作)。

以下是一些(未经测试的)代码,应该为您指明正确的方向:

controller :users do
    put '/activate/:email_token', :to => :activate,  :as => 'activate_email'
end

哪个应该将 PUT 路由到/activate/xxxx设置为. 它还应该为您提供一个可以传递激活令牌的路由(您可以通过在命令行上运行来检查您的应用程序提供了哪些路由)。UsersController#activateparams[:email_token]xxxx#activate_email_urlrake routes

于 2013-05-21T15:04:15.493 回答