未定义的方法`protect_against_forgery?'对于#<#

时间:2013-05-21 14:19:57

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我在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" %>

导致此错误。有没有办法解决这个问题?

3 个答案:

答案 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/xxxxUsersController#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 }