【问题标题】:Call controller method from button_to从 button_to 调用控制器方法
【发布时间】:2014-05-20 14:42:35
【问题描述】:

我想在控制器中调用这个方法

  def setplaylist
   @stream.programmed_at = Time.now.to_i
  end

从这一行来看

<%= button_to 'Reprogram', @stream, :method => :setplaylist, :remote => true %>

我收到 No routes match [POST] 错误。

编辑: 我的 routes.rb 文件

   Rails.application.routes.draw do
  get 'splashpage/splash'
  root :to => 'splashpage#splash', :as =>'splash'


resources :streams do
  resources :videos

end

EDIT 2 rake 路线

         Prefix Verb   URI Pattern                                   Controller#Action
splashpage_splash GET    /splashpage/splash(.:format)                  splashpage#splash
           splash GET    /                                             splashpage#splash
    stream_videos GET    /streams/:stream_id/videos(.:format)          videos#index {:member=>{:setplaylist=>:post}}
                  POST   /streams/:stream_id/videos(.:format)          videos#create {:member=>{:setplaylist=>:post}}
 new_stream_video GET    /streams/:stream_id/videos/new(.:format)      videos#new {:member=>{:setplaylist=>:post}}
edit_stream_video GET    /streams/:stream_id/videos/:id/edit(.:format) videos#edit {:member=>{:setplaylist=>:post}}
     stream_video GET    /streams/:stream_id/videos/:id(.:format)      videos#show {:member=>{:setplaylist=>:post}}
                  PATCH  /streams/:stream_id/videos/:id(.:format)      videos#update {:member=>{:setplaylist=>:post}}
                  PUT    /streams/:stream_id/videos/:id(.:format)      videos#update {:member=>{:setplaylist=>:post}}
                  DELETE /streams/:stream_id/videos/:id(.:format)      videos#destroy {:member=>{:setplaylist=>:post}}
          streams GET    /streams(.:format)                            streams#index {:member=>{:setplaylist=>:post}}
                  POST   /streams(.:format)                            streams#create {:member=>{:setplaylist=>:post}}
       new_stream GET    /streams/new(.:format)                        streams#new {:member=>{:setplaylist=>:post}}
      edit_stream GET    /streams/:id/edit(.:format)                   streams#edit {:member=>{:setplaylist=>:post}}
           stream GET    /streams/:id(.:format)                        streams#show {:member=>{:setplaylist=>:post}}
                  PATCH  /streams/:id(.:format)                        streams#update {:member=>{:setplaylist=>:post}}
                  PUT    /streams/:id(.:format)                        streams#update {:member=>{:setplaylist=>:post}}
                  DELETE /streams/:id(.:format)                        streams#destroy {:member=>{:setplaylist=>:post}}

rake 路线 | grep 设置播放列表

       stream_videos GET    /streams/:stream_id/videos(.:format)          videos#index {:member=>{:setplaylist=>:post}}
                  POST   /streams/:stream_id/videos(.:format)          videos#create {:member=>{:setplaylist=>:post}}
 new_stream_video GET    /streams/:stream_id/videos/new(.:format)      videos#new {:member=>{:setplaylist=>:post}}
edit_stream_video GET    /streams/:stream_id/videos/:id/edit(.:format) videos#edit {:member=>{:setplaylist=>:post}}
     stream_video GET    /streams/:stream_id/videos/:id(.:format)      videos#show {:member=>{:setplaylist=>:post}}
                  PATCH  /streams/:stream_id/videos/:id(.:format)      videos#update {:member=>{:setplaylist=>:post}}
                  PUT    /streams/:stream_id/videos/:id(.:format)      videos#update {:member=>{:setplaylist=>:post}}
                  DELETE /streams/:stream_id/videos/:id(.:format)      videos#destroy {:member=>{:setplaylist=>:post}}
          streams GET    /streams(.:format)                            streams#index {:member=>{:setplaylist=>:post}}
                  POST   /streams(.:format)                            streams#create {:member=>{:setplaylist=>:post}}
       new_stream GET    /streams/new(.:format)                        streams#new {:member=>{:setplaylist=>:post}}
      edit_stream GET    /streams/:id/edit(.:format)                   streams#edit {:member=>{:setplaylist=>:post}}
           stream GET    /streams/:id(.:format)                        streams#show {:member=>{:setplaylist=>:post}}
                  PATCH  /streams/:id(.:format)                        streams#update {:member=>{:setplaylist=>:post}}
                  PUT    /streams/:id(.:format)                        streams#update {:member=>{:setplaylist=>:post}}
                  DELETE /streams/:id(.:format)                        streams#destroy {:member=>{:setplaylist=>:post}}

在进行 Max 的更改后,我收到一个无方法错误。未定义的方法 setplaylist_stream_path。

【问题讨论】:

  • 发布您的routes.rb 代码
  • 试试这个&lt;%= button_to 'Reprogram', :controller =&gt;'your_controller_name',:action =&gt; 'setplaylist' :method =&gt; :get, :remote =&gt; true %&gt;
  • 哎呀我错过了一个逗号(,)它应该是这样的&lt;%= button_to 'Reprogram', :controller =&gt;'your_controller_name',:action =&gt; 'setplaylist',:method =&gt; :get, :remote =&gt; true %&gt;
  • 没有路由匹配 {:action=>"setplaylist", :controller=>"streams_controller", :id=>"teststream", :method=>:post, :remote=>true}。我使用friendlyids所以id是一个字符串而不是一个整数
  • 你能发布你的rake routes output吗?

标签: ruby-on-rails ruby button view controller


【解决方案1】:

您需要添加 setplaylist 路由。在您的路线文件中,更改此项

resources :streams do
  resources :videos
end

resources :streams, :member => {:setplaylist => :post} do
  resources :videos
end

现在您的 button_to(我认为它默认会生成一个发布请求)应该可以工作了。最好把语法改成这样:

<%= button_to 'Reprogram', setplaylist_stream_path(@stream), :remote => true %>

您还需要确保在您的操作代码运行时定义了@stream。您可能还想在更改后保存@stream。将您的操作更改为

def setplaylist
  @stream = Stream.find(params[:id])
  @stream.programmed_at = Time.now.to_i
  @stream.save
end

如果这就是它所做的全部,我实际上只是在调用通常的“更新”操作时执行此操作,而不是为其执行新操作。

【讨论】:

  • 我在 Streams#edit 中遇到 NoMethodError。未定义的方法`setplaylist_stream_path'
  • 你能在终端里rake routes | grep setplaylist
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
相关资源
最近更新 更多