Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3.2使用`method::put`将_链接到`(电子邮件中)`仍在生成GET请求_Ruby On Rails_Ruby_Email_Http_Hyperlink - Fatal编程技术网

Ruby on rails Rails 3.2使用`method::put`将_链接到`(电子邮件中)`仍在生成GET请求

Ruby on rails Rails 3.2使用`method::put`将_链接到`(电子邮件中)`仍在生成GET请求,ruby-on-rails,ruby,email,http,hyperlink,Ruby On Rails,Ruby,Email,Http,Hyperlink,在我的应用程序中,我会自动发送电子邮件,提醒应用程序完成面试过程的下一步。该电子邮件有一个选择退出链接,单击该链接时,应点击控制器操作,触发状态机事件,将其状态更改为opted\u out。该链接不工作,从localhost控制台看,这似乎是因为该链接仍在生成GET请求,而该请求没有路由(错误为ActionController::RoutingError(未找到):) 以下是控制台,显示不需要的GET请求: Started GET "/worker/application/opt_out.1"

在我的应用程序中,我会自动发送电子邮件,提醒应用程序完成面试过程的下一步。该电子邮件有一个选择退出链接,单击该链接时,应点击控制器操作,触发状态机事件,将其状态更改为
opted\u out
。该链接不工作,从localhost控制台看,这似乎是因为该链接仍在生成GET请求,而该请求没有路由(错误为
ActionController::RoutingError(未找到):

以下是控制台,显示不需要的GET请求:

Started GET "/worker/application/opt_out.1" for 10.0.2.2 at 2014-08-29 17:08:06 +0000
Processing by LandingController#show as 
  Parameters: {"category"=>"worker/application", "location"=>"opt_out"}
以下是链接:

link_to 'stop getting these reminders', opt_out_worker_application_url(@worker), method: :put, style: 'background-color: #fff; color: #56A0D3; display: inline-block; margin-bottom: 5px; margin: 0px; padding: 0px; text-decoration: none'
以下是
工作者
命名空间的所有路由:

# routes.rb

  namespace :worker do
    resource :application, only: [:create, :new, :show] do
      member do 
        put 'opt_out' => 'application#opt_out'
      end
    end
    resources :jobs do
      member do
        post 'compete' => 'jobs#compete'
        delete 'compete' => 'jobs#withdraw'
      end
      resources :comments, only: [:create]
      resources :timesheets, only: [:create, :new, :show]
    end
    resources :banks, only: [:create, :new, :destroy]
    scope 'money' do
      root to: 'money#index', as: 'money'
      post 'withdraw' => 'money#withdraw', as: 'money_withdraw'
    end
    get 'profile' => 'profiles#show'
    root to: 'jobs#index'
  end
以下是控制器操作:

# applications_controller.rb

      def opt_out
        @worker = Worker.find(params[:id])
        if @worker.interview_requested? or @worker.onboarding_requested?
          if @worker.fire_state_event(:opt_out)
            AdminsMailer.sweeper_opted_out(@worker.id)
            redirect_to root_url, notice: "You have successfully opted out of the application process. We're sorry to see you go, and hope you'll consider returning in the future!"
          else
            redirect_to root_url, alert: "There was a problem. Please contact Support if you need further assistance."
          end
        else
          redirect_to root_url, alert: "There was a problem. Please contact Support if you need further assistance."
        end
      end
这里是rake路由:

opt_out_worker_application PUT    /worker/application/opt_out(.:format)           worker/application#opt_out
                worker_application POST   /worker/application(.:format)                   worker/applications#create
            new_worker_application GET    /worker/application/new(.:format)               worker/applications#new
                                   GET    /worker/application(.:format)                   worker/applications#show

这是因为这是电子邮件上下文中的链接。它是:

方法:HTTP谓词的符号-此修饰符将动态创建 HTML表单,并立即使用 指定了HTTP谓词。用于让链接执行POST操作 在删除记录等危险操作中(搜索机器人可以 在对站点进行爬网时进行跟踪)。支持的动词有:post、:delete、, :补丁,和:放置。请注意,如果用户禁用了JavaScript,则 请求将退回到使用GET。如果使用href:'#',则用户 禁用JavaScript后,单击链接将无效。如果你 如果依赖于POST行为,则应在 控制器使用请求对象的post方法执行的操作?, 删除、修补或放置


出于安全原因,不允许在电子邮件和表单中使用可执行JavaScript。因此,用JS呈现表单并执行
PUT
请求是不可能的,因此这就回到了上文引文中所述的
GET

链接到
的方法选项起作用,因为你的应用程序包含一些javascript,可以拦截点击链接。javascript使用正确的方法创建表单(为浏览器不支持的请求方法添加输入元素),并支持该方法

这在电子邮件中不起作用:您的站点的javascript不存在,电子邮件客户端通常不运行javascript

在某些情况下,包含实际表单是可行的,但通常不会(或显示可怕的警告)-例如,请参阅


不幸的是,除了一个简单的“获取”链接之外,没有其他选择(你当然可以让它进入确认页面,在那里你有一个按钮/链接可以触发post请求)。

一个指向
链接怎么能
放置
link\u to
不能有字段/表单,那么将其作为
PUT
POST
有什么意义呢?我不明白你的意思,因为你问了两个问题,看起来至少是半修辞性的。关于我应该更改什么,你有什么建议吗?为什么要将链接链接到放置状态?我想我必须这样做,因为该路径是一条
PUT
路径。实际上没有与我链接到的控制器操作相对应的视图。这里是新手!那么删除
方法:
声明会有帮助吗?是的,只需删除它。。如果遇到路由错误,请显示与控制器相关的所有路由谢谢。我很确定我“试图”做的是可能的,因为我在我的管理仪表板中有类似的链接来更改工作状态,它们工作得很好。无论如何,我担心情况会是这样。处理这个问题的最佳方法是什么?用另一个按钮将此人带到一个页面,该按钮可以做同样的事情?@sixty4bit应该可以。我在很多地方都见过这种做法。谢谢。如何将员工ID从电子邮件视图传递到确认页面?我可以强迫他们登录,但如果有其他方法,我宁愿不这样做。你必须在链接中放置那个或某种不透明的标识来标识用户