Railsowe "link_to" wywoływane z funkcji JS ...and Datatables.net

przepraszam za zamieszanie #insurance-groups …i #companies
Bo mam kilka takich.

Aby możliwe było żonglowanie w definicji ajax: {…}
type GET/POST koniecznie musiałem ustawić: ServerSide znowu na true, gdyż w przeciwnym wypadku w WEBricku widzidziałem cały czas GET/ …

Dla wywołania jak zaproponowałeś pojawia się:

Started POST “/companies.json” for 127.0.0.1 at 2015-01-22 19:07:24 +0100
Processing by CompaniesController#create as JSON
Parameters: {“draw”=>“1”, “columns”=>{“0”=>{“data”=>“0”, “name”=>"", “searchable”=>“false”, “orderable”=>“false”, “search”=>{“value”=>"", “regex”=>“false”}}, “1”=>{“data”=>“1”, “name”=>"", “searchable”=>“true”, “orderable”=>“true”, “search”=>{“value”=>"", “regex”=>“false”}}, “2”=>{“data”=>“2”, “name”=>"", “searchable”=>“true”, “orderable”=>“true”, “search”=>{“value”=>"", “regex”=>“false”}}, “3”=>{“data”=>“3”, “name”=>"", “searchable”=>“true”, “orderable”=>“true”, “search”=>{“value”=>"", “regex”=>“false”}}, “4”=>{“data”=>“4”, “name”=>"", “searchable”=>“true”, “orderable”=>“true”, “search”=>{“value”=>"", “regex”=>“false”}}, “5”=>{“data”=>“5”, “name”=>"", “searchable”=>“true”, “orderable”=>“true”, “search”=>{“value”=>"", “regex”=>“false”}}, “6”=>{“data”=>“6”, “name”=>"", “searchable”=>“true”, “orderable”=>“true”, “search”=>{“value”=>"", “regex”=>“false”}}, “7”=>{“data”=>“7”, “name”=>"", “searchable”=>“true”, “orderable”=>“true”, “search”=>{“value”=>"", “regex”=>“false”}}, “8”=>{“data”=>“8”, “name”=>"", “searchable”=>“true”, “orderable”=>“true”, “search”=>{“value”=>"", “regex”=>“false”}}, “9”=>{“data”=>“9”, “name”=>"", “searchable”=>“true”, “orderable”=>“true”, “search”=>{“value”=>"", “regex”=>“false”}}}, “order”=>{“0”=>{“column”=>“0”, “dir”=>“asc”}}, “start”=>“0”, “length”=>“10”, “search”=>{“value”=>"", “regex”=>“false”}}
User Load (0.7ms) SELECT “users”.* FROM “users” WHERE “users”.“id” = $1 ORDER BY “users”.“id” ASC LIMIT 1 [[“id”, 4]]
Completed 400 Bad Request in 15ms

ActionController::ParameterMissing - param is missing or the value is empty: company:
actionpack (4.2.0) lib/action_controller/metal/strong_parameters.rb:249:in require' () home/bodzio/www/pop/app/controllers/companies_controller.rb:98:incompany_params’
() home/bodzio/www/pop/app/controllers/companies_controller.rb:47:in create' actionpack (4.2.0) lib/action_controller/metal/implicit_render.rb:4:insend_action’
actionpack (4.2.0) lib/abstract_controller/base.rb:198:in process_action' actionpack (4.2.0) lib/action_controller/metal/rendering.rb:10:inprocess_action’
actionpack (4.2.0) lib/abstract_controller/callbacks.rb:20:in block in process_action' activesupport (4.2.0) lib/active_support/callbacks.rb:117:incall’
activesupport (4.2.0) lib/active_support/callbacks.rb:117:in call' activesupport (4.2.0) lib/active_support/callbacks.rb:169:inblock in halting’
activesupport (4.2.0) lib/active_support/callbacks.rb:151:in call' activesupport (4.2.0) lib/active_support/callbacks.rb:151:inblock in halting_and_conditional’
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in call' activesupport (4.2.0) lib/active_support/callbacks.rb:234:inblock in halting’

rozumiem, że jest to związane z:

class CompaniesController < ApplicationController
before_action :authenticate_user!

def index
respond_to do |format|
format.html
format.json{ render json: CompaniesDatatable.new(view_context, { only_for_current_user_id: @current_user.id }) }
end
end

end

jest jeszcze setting:

"sServerMethod": "POST"

So close! :slight_smile: Wystarczy teraz żeby Twój index odpowiadał na POST a nie GET,

resources :companies, except: [:index, :create] do
  post 'index', on: :collection
end

coś takiego w routes.rb

A to jest wewnątrz definicji ajax: { …}, czy poza nią?

routes czy resources ?

resources oczywiście ;p

A, tylko zmień na insurance, w AJAX’ie też, bo widzę, że edytowałeś posta wcześniej

jest jeszcze setting:

“sServerMethod”: “POST”

A to jest wewnątrz definicji ajax: { …}, czy poza nią?

Duuude, już masz POST, popatrz w logi, wystarczy tylko żeby wywoływało odpowiednią akcję w odpowiednim kontrolerze. Musisz wywalić POST /costam matchujący do akcij create i dodać POST /costam matchujący do index

no /cośtam tak średnio działa :frowning:

Coś chyba w tym route.rb namieszaliśmy

Po kolei - do jakiego kontrolera ma się odnosić Twoja tabela? CompaniesController czy coś z insurance?

Zostanmy przy Company

  resources :companies, except: [:index, :create] do
    post 'index', on: :collection
  end

companies_url POST /companies/index(.:format) companies#index
new_company_url GET /companies/new(.:format) companies#new
edit_company_url GET /companies/:id/edit(.:format) companies#edit
company_url GET /companies/:id(.:format) companies#show
PATCH /companies/:id(.:format) companies#update
PUT /companies/:id(.:format) companies#update
DELETE /companies/:id(.:format) companies#destroy

I teraz wywołanie:

http://127.0.0.1:3000/companies/ nic nie daje. zgłasza błąd

A, przepraszam:

resources :companies, except: [:index, :create] do
  post :index, on: :collection
end

rake routes | grep compa
companies POST   /companies(.:format)             companies#index
                companies POST   /companies/index(.:format)                                              companies#index
              new_company GET    /companies/new(.:format)                                                companies#new
             edit_company GET    /companies/:id/edit(.:format)                                           companies#edit
                  company GET    /companies/:id(.:format)                                                companies#show
                          PATCH  /companies/:id(.:format)                                                companies#update
                          PUT    /companies/:id(.:format)                                                companies#update
                          DELETE /companies/:id(.:format)                                                companies#destroy

Zamień 'index' na :index, najwidoczniej symbole są inaczej traktowane jak pasują do standardowych railsowych akcji

po zmianie:

                companies POST   /companies(.:format)                                                    companies#index
              new_company GET    /companies/new(.:format)                                                companies#new
             edit_company GET    /companies/:id/edit(.:format)                                           companies#edit
                  company GET    /companies/:id(.:format)                                                companies#show
                          PATCH  /companies/:id(.:format)                                                companies#update
                          PUT    /companies/:id(.:format)                                                companies#update
                          DELETE /companies/:id(.:format)                                                companies#destroy

i

a dla http://127.0.0.1:3000/companies

WEBric:

ActionController::RoutingError (No route matches [GET] “/companies”):
actionpack (4.2.0) lib/action_dispatch/middleware/debug_exceptions.rb:21:in call' actionpack (4.2.0) lib/action_dispatch/middleware/show_exceptions.rb:30:incall’
railties (4.2.0) lib/rails/rack/logger.rb:38:in call_app' railties (4.2.0) lib/rails/rack/logger.rb:20:inblock in call’
activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in block in tagged' activesupport (4.2.0) lib/active_support/tagged_logging.rb:26:intagged’
activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in tagged' railties (4.2.0) lib/rails/rack/logger.rb:20:incall’

.i pojawia się znany ekran:
Routing Error
No route matches [GET] “/companies”

Zacznijmy może od tego, że wybierając link w menu wybieram:
companies_path … a to jest chyba domyślnie metoda GET

:smiley: Pewnie polegaleś wcześniej na GET /companies żeby wejść na stronę. Tak na szybko:

  resources :companies do
    post 'datatables_index', on: :collection
  end

data-source="<%= datatables_index_companies_path(format: :json) %>"

Kontroler

def datatables_index
  respond_to do |format|
    format.json{ render json: CompaniesDatatable.new(view_context, { only_for_current_user_id: @current_user.id }) }
  end
end

Ależ przeszkód :smiley:

1 Like

… i na koniec i tak nie zadziała :wink: :smiley:

…daj chwilkę na wprowadzenie zmiany

datatables_index_companies POST /companies/datatables_index(.:format) companies#datatables_index
companies GET /companies(.:format) companies#index
POST /companies(.:format) companies#create
new_company GET /companies/new(.:format) companies#new
edit_company GET /companies/:id/edit(.:format) companies#edit
company GET /companies/:id(.:format) companies#show
PATCH /companies/:id(.:format) companies#update
PUT /companies/:id(.:format) companies#update
DELETE /companies/:id(.:format) companies#destroy