2017-08-25 7 views
0

Ruby on RailsでコーディングされたWeb APIを取得しました。Ruby on Rails - コントローラ内のコードが呼び出されない理由

私は前任者のコードを認識しようとしていますが、私のルートが私のコントローラにつながっていない理由を理解できません。

私のルートは、このように設定されている:

resources :bars, :defaults => { :format => 'json' } do 
    member do 
     post :subscription 
     delete :subscription 
     get :bar_comments 
     get :events 
     get :default_event 
     get :dates 
     post :store_sections 
     put :store_sections 
     get :store_sections, to: 'bars#store_sections_index' 
     post :tables 
     put :tables 
     get :tables, to: 'bars#tables_index' 
     post :traffic_breakpoint 
     get :traffic 
     get :entrance_traffic 
     put :auto_events 
     get :fake_counter 
     post :fake_counter 
     put :stripe_info 
    end 
    collection do 
     get :favorites 
     get :test, :defaults => { :format => 'json' } 
    end 
    end 

は、私はバー/お気に入りのURLにGETリクエストをキャッチしたいです。ここで

はここで、私はバー/お気に入りを呼び出すとお気に入り機能がbars_controller

def favorites 
logger.debug "FAVORITE BARS!!!#####################################################################" 
    if current_user.present? 
     @bars = Bar.average_join.filter_favorite(current_user) 
     render :index 
    else 
     render json: { error: { error_code: 5, error_message: 'You need to be authentificated' } }, status: :unprocessable_entity 
    end 
    end 

上で定義されている方法である私は、端末とログに見えるものです:

Started GET "/bars/favorites" for 111.111.11.111 at 2017-08-25 22:00:52 +0200 
Processing by BarsController#favorites as JSON 
    Parameters: {"bar"=>{}} 
    AccessToken Load (0.8ms) SELECT "access_tokens".* FROM "access_tokens" WHERE "access_tokens"."access_token" = 'ebeddb822e1f36848162818a585df3d0' LIMIT 1 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] 
Completed 404 Not Found in 11ms (Views: 0.5ms | ActiveRecord: 1.3ms) 

ルートが見つかり、コントローラーも。私のログメッセージは、(logger.debug「FAVORITE BARS !!! .....)しない理由

AbstractController::ActionNotFound (The action 'favorites' could not be found for BarsController): 
    app/helpers/sabayon_middleware.rb:25:in `call' 

は、私が理解することはできません:私は、コントローラ内のお気に入りの機能の名前を変更すると、私はエラーになりますログに表示されるのは好きな機能が呼び出されたようなものだが、何が起こるべきなのかは(機能の中で)起こることはない(機能内で)

プラス私はまったく同じ構造体をクラブクラブルートの定義方法は次のとおりです。

resources :clubs, :defaults => { :format => 'json' } do 
    member do 
     post :subscription 
     delete :subscription 
     get :club_comments 
     get :events 
     get :default_event 
     get :dates 
     post :store_sections 
     put :store_sections 
     get :store_sections, to: 'clubs#store_sections_index' 
     post :tables 
     put :tables 
     get :tables, to: 'clubs#tables_index' 
     post :traffic_breakpoint 
     get :traffic 
     get :entrance_traffic 
     put :auto_events 
     get :fake_counter 
     post :fake_counter 
     put :stripe_info 
    end 
    collection do 
     get :favorites 
    end 
    end 

お気に入りの機能この場合

def favorites 
logger.debug "FAVORITES CLUBS #####################################################################" 
if current_user.present? 
    @clubs = Club.average_join.filter_favorite(current_user) 
    render :index 
else 
     render json: {error: {error_code: 5, error_message: 'You need to be authentificated'}}, status: :unprocessable_entity 
    end 
    end 

私は私が手のクラブ/お気に入りを呼び出すときにすべてが、完璧に動作します:コントローラに

Started GET "/clubs/favorites" for 111.111.11.111 at 2017-08-25 22:23:26 +0200 
Processing by ClubsController#favorites as JSON 
    Parameters: {"club"=>{}} 
    AccessToken Load (0.7ms) SELECT "access_tokens".* FROM "access_tokens" WHERE "access_tokens"."access_token" = '5835db5eb54c0d05114ceb86688b2a31' LIMIT 1 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] 
FAVORITES CLUBS ##################################################################### 
    Club Load (2.4ms) SELECT clubs.*, round(AVG (club_comments.rate), 2) AS rate_average, clubs.*, club_subscriptions.id IS NOT NULL AS is_favorite FROM "clubs" LEFT OUTER JOIN club_comments ON club_comments.club_id = clubs.id INNER JOIN club_subscriptions ON club_subscriptions.club_id = clubs.id AND club_subscriptions.user_id = 1 GROUP BY clubs.id, club_subscriptions.id 
    Rendered clubs/index.json.jbuilder (4.7ms) 
Completed 200 OK in 28ms (Views: 14.4ms | ActiveRecord: 5.5ms) 

UPDATE 2017年8月28日

私がして問題を解決するために管理しましたこの行をbars_controllerにコメントする:

load_and_authorize_resource 

So私はclubs/favoritesが働いている理由とbars/favoritesを理解していませんが、少なくとも私は今働くことができます。

UPDATE 2017年8月29日

@Leitoで尋ねたとして、ここでは私の能力クラスの内容は次のとおりです。アクティブなレコードのクエリがActiveRecord::RecordNotFoundで失敗したときに

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    #can :read, :all 
    default_abilities 
    if user.persisted? 
     user_basic_abilities(user) 

     if user.admin? 
     club_owner_abilities(user) 
     can :manage, :all 
     elsif user.club_owner? 
     club_owner_abilities(user) 
     elsif user.user? 

     end 
    else 
     not_connected_abilities 
    end 
    end 

    def default_abilities 
    can [:index, :show, :events, :dates, :club_comments, :tables_index, :store_sections_index, :letsencrypt, :fake_counter], Club 
    can [:index, :show], Artist 
    can [:index, :show, :dates, :tables_index, :premium], Event 
    can [:index, :show], Ticket 
    end 

    def user_basic_abilities(user) 
    can [:index, :show, :update, :me, :update_password, :club_comments, :customer, :get_customer, :source, :select_source, :delete_source, :bookings], User, id: user.id 
    can :upload, Picture 
    can :destroy, Picture, user_id: user.id 

    can :create, Booking 
    can :share, Booking do |booking| 
     booking.owner.id == user.id 
    end 

    can :show, Booking do |booking| 
     booking.user_entrances.where(user_id: user.id).count > 0 
    end 

    can :subscription, Club 
    can :favorites, Club, user_id: user.id 

    can :create, ClubComment 
    can [:update, :destroy], ClubComment, user_id: user.id 

    can [:subscription, :vote], Artist 

    can [:favorites, :subscription], Event 

    can :create, Cart 
    can [:index, :update, :destroy, :cart_items, :user_infos, :order], Cart, user_id: user.id 
    can [:payment], Order do |order| 
     order.user.id == user.id 
    end 
    end 

    def club_owner_abilities(user) 
    can :create, Club 
    can :create, Artist 

    can :upload, Picture 
    can :destroy, Picture, user_id: user.id 

    can [:update, :tables, :store_sections, :traffic_breakpoint, :traffic, :entrance_traffic, :default_event, :auto_events], Club, id: user.club_id 

    can [:update, :stats, :votes], Artist 

    can :create, Event 
    can [:update, :destroy, :tables, :default_tables, :bookings], Event, club_id: user.club_id 

    can [:create, :update, :destroy], Promotion do |promo| 
     promo.event && promo.event.club_id == user.club_id 
    end 

    can [:receipt, :confirmation_table, :cancelation_table], Booking 
    can [:consume, :show, :payments, :refund_payment], Booking do |booking| 
     booking.event && booking.event.club_id == user.club_id 
    end 

    can [:create, :update, :destroy], Ticket do |ticket| 
     ticket.event && ticket.event.club_id == user.club_id 
    end 
    end 

    def not_connected_abilities 
    can :create, AccessToken 
    can [:create, :login], User 
    # can :register, MobileDevice 
    end 
end 
+2

「お気に入り」の 'before_action'が実行を停止している可能性があります。返されるステータスコードが「完了404見つかりません」であることを確認してください。 – Leito

+0

'route.rb'ファイルの残りの部分をもう一度チェックして、あなたと競合する別のルートがあるかもしれないことを伝えるのは難しいです。それ以外は 'BarsController'の他のメソッドをテストし、' show'や 'edit'のようなデフォルトのものを参照してください。 –

+0

@PhuPhan、show/edit関数/ルートはちょうどうまくいっています – 118218

答えて

1

load_and_authorize_resourceカンカンまたはcancancanから来ています。これらはユーザーがアクセスできるレコードを制限する自動化の宝石です。どのようにクラブ/お気に入りバー/お気に入りが異なる権限を持っているか見てみましょう。あなたはこれがあなたのコントローラからの応答を説明できるフォームCanCan::AccessDeniedを救出する方法に応じて

can :favorites, Club, user_id: user.id 

:ユーザーが既存のに似can :favorites, Bar上の許可が不足していることが表示されますあなたのAbilityクラスから

0

404はレールによって返されます。つまり、UserまたはBarまたはその他の関連するfindのいずれかの方法でエラーが発生しています(DBで利用できないため)。

+0

私はこれが理由だとは思わないが、お気に入りのクラブもデータベースにないからだ。 – 118218

関連する問題