user3646037
user3646037

Reputation: 293

Call controller method from button_to

I want to call this method in the controller

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

With this line from the view

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

I get a No routes match [POST] error.

Edit: My routes.rb file

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


resources :streams do
  resources :videos

end

EDIT 2 rake routes

         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 routes | grep setplaylist

       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}}

I am receiving a no method error after making Max's changes. undefined method setplaylist_stream_path.

Upvotes: 0

Views: 1055

Answers (1)

Max Williams
Max Williams

Reputation: 32933

You need to add the setplaylist route. In your routes file, change this

resources :streams do
  resources :videos
end

to

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

Now your button_to (which generates a post request by default, i think) should work. it's better to change the syntax to this:

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

You'll also need to make sure that @stream is defined when your action code runs. You also probably want to save @stream after you've changed it. Change your action to

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

If this is all that it does, i would actually just do this in a call to the usual 'update' action rather than make a new action for it.

Upvotes: 1

Related Questions