【问题标题】:Rails - JSON callback looking for wrong idRails - 寻找错误 ID 的 JSON 回调
【发布时间】:2013-08-20 12:11:24
【问题描述】:

我有一个由动态生成的 JSON 构建的时间线。应该发生的是,它会循环遍历给定用户的事件,并且时间轴会填充这些事件。

当我以 current_user 身份访问它时,它工作正常。我已将代码修改为使用@access_user 而不是 current_user,这样我就可以在以该用户的版主身份登录时访问它。

在这种情况下,应用正在尝试使用 ID 为 21 的事件填充时间线(不存在 - 21 是事件用户的 ID)。

无论我是以用户还是版主等身份登录,这现在都不起作用 - 所以我猜这是@access_user正在创建的问题。

谁能告诉我为什么会这样,我该如何解决?谢谢!

调用的JS初始化时间线:

$(document).ready(function() {
                createStoryJS({
                    type:       'timeline',
                    width:      '820',
                    height:     '600',
                    source:     '/users/<%= @access_user.id %>/events.json?callback',
                    embed_id:   'my-timeline',
                    font:       'Euphoria-Droid',
                    debug:      true,
                    gmap_key:   '#',
                    maptype:    'HYBRID'
                });
            });

这会正确处理到 /users/21/events.json?callback

@access_user 的设置方式如下:

  def access_user
    if user_signed_in?
      @access_user = current_user
    elsif keyholder_signed_in?
      @access_user = current_keyholder.user
    elsif guest_signed_in?
      @access_user = current_guest.user
    end
  end

如果我在视图中调用 ,@access_user 似乎可以正常工作。

这是应该填充时间线的 json.json_builder 文件:

timeline do
  headline @access_user.first_name
  type "default"
  text "A Timeline"
  startDate ""
  date @events do |event|
    startDate event.start_date.strftime('%Y,%m,%d')
    endDate ""
    headline event.headline
    text event.text
    asset do
        media event.media
        caption event.caption
    end
  end
end

这是事件控制器中的 myevents 操作:

  def myevents
    @events = @access_user.events
    respond_with @users
  end

还有痕迹:

Started GET "/users/21/events.json?callback?callback=onJSONP_Data" for 127.0.0.1
 at 2013-08-20 13:09:28 +0100
Processing by EventsController#myevents as JSON
  Parameters: {"callback?callback"=>"onJSONP_Data", "id"=>"21"}
  ←[1m←[35mKeyholder Load (2.0ms)←[0m  SELECT "keyholders".* FROM "keyholders" W
HERE "keyholders"."id" = 5 LIMIT 1
  ←[1m←[36mUser Load (3.0ms)←[0m  ←[1mSELECT "users".* FROM "users" WHERE "users
"."id" = 21 LIMIT 1←[0m
  ←[1m←[35mEvent Load (5.0ms)←[0m  SELECT "events".* FROM "events" WHERE "events
"."id" = ? LIMIT 1  [["id", "21"]]
Completed 404 Not Found in 51ms

ActiveRecord::RecordNotFound (Couldn't find Event with id=21):
  activerecord (3.2.14) lib/active_record/relation/finder_methods.rb:344:in `fin
d_one'
.
.
.

更新: routes.rb 相关部分:

resources :events do
    member do
      get 'myevents'
    end
  end

match 'users/:id/events' => 'events#myevents'

更新:以访客身份登录时的新跟踪(将成员更改为路由上的集合后)用户 ID=2,访客 ID=2:

Started GET "/timelines/4" for 127.0.0.1 at 2013-08-20 16:33:41 +0100
Processing by TimelinesController#show as HTML
  Parameters: {"id"=>"4"}
  ←[1m←[36mGuest Load (2.0ms)←[0m  ←[1mSELECT "guests".* FROM "guests" WHERE "gu
ests"."id" = 2 LIMIT 1←[0m
  ←[1m←[35mUser Load (10.0ms)←[0m  SELECT "users".* FROM "users" WHERE "users"."
id" = 2 LIMIT 1
  ←[1m←[36mTimeline Load (1.0ms)←[0m  ←[1mSELECT "timelines".* FROM "timelines"
WHERE "timelines"."id" = ? LIMIT 1←[0m  [["id", "4"]]
  Rendered timelines/_show_timeline.html.erb (1.0ms)
  Rendered timelines/_my_timeline.html.erb (1.0ms)
  Rendered timelines/_new_event.html.erb (339.0ms)
  ←[1m←[35mEvent Load (2.0ms)←[0m  SELECT "events".* FROM "events" INNER JOIN "t
imelines" ON "events"."timeline_id" = "timelines"."id" WHERE "timelines"."user_i
d" = 2
  ←[1m←[36mEXPLAIN (0.0ms)←[0m  ←[1mEXPLAIN QUERY PLAN SELECT "events".* FROM "e
vents" INNER JOIN "timelines" ON "events"."timeline_id" = "timelines"."id" WHERE
 "timelines"."user_id" = 2←[0m
EXPLAIN for: SELECT "events".* FROM "events" INNER JOIN "timelines" ON "events".
"timeline_id" = "timelines"."id" WHERE "timelines"."user_id" = 2
0|0|0|SCAN TABLE events (~1000000 rows)
0|1|1|SEARCH TABLE timelines USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)

  Rendered timelines/_edit_events.html.erb (1034.1ms)
  Rendered timelines/_delete_events.html.erb (5.0ms)
  Rendered timelines/show.html.erb within layouts/application (3915.2ms)
  ←[1m←[35mFuneral Load (4.0ms)←[0m  SELECT "funerals".* FROM "funerals" WHERE "
funerals"."user_id" = 2 LIMIT 1
  ←[1m←[36mTimeline Load (1.0ms)←[0m  ←[1mSELECT "timelines".* FROM "timelines"
WHERE "timelines"."user_id" = 2 LIMIT 1←[0m
  ←[1m←[35mKeyholder Load (2.0ms)←[0m  SELECT "keyholders".* FROM "keyholders" W
HERE "keyholders"."user_id" = 2 LIMIT 1
  Rendered partials/_guest_options.html.erb (395.0ms)
Completed 200 OK in 12947ms (Views: 9729.6ms | ActiveRecord: 133.0ms)


Started GET "/users/2/events.json?callback?callback=onJSONP_Data" for 127.0.0.1
at 2013-08-20 16:33:58 +0100
Processing by EventsController#myevents as JSON
  Parameters: {"callback?callback"=>"onJSONP_Data", "id"=>"2"}
  ←[1m←[36mGuest Load (17.0ms)←[0m  ←[1mSELECT "guests".* FROM "guests" WHERE "g
uests"."id" = 2 LIMIT 1←[0m
  ←[1m←[35mUser Load (3.0ms)←[0m  SELECT "users".* FROM "users" WHERE "users"."i
d" = 2 LIMIT 1
  ←[1m←[36mEvent Load (3.0ms)←[0m  ←[1mSELECT "events".* FROM "events" WHERE "ev
ents"."id" = ? LIMIT 1←[0m  [["id", "2"]]
Completed 404 Not Found in 149ms

ActiveRecord::RecordNotFound (Couldn't find Event with id=2):

【问题讨论】:

  • 您的 ID 来自您的用户资源(即/users/21/events.json 将在您的参数哈希中设置 id=21)。您可能需要将事件 ID 定义为单独的参数? UsersController#events 和 EventsController#myevents 方法是什么样的?
  • myevents 方法在上面,我在 users 控制器中没有 events 方法。在我开始使用 @access_user 而不是 current_user 之前,这一切正常 - 即使我以用户身份登录,它现在也不起作用。我不明白这一点,因为当以用户身份登录时,access_user 应该等于 current_user 对象 - 还是它只传递 id 而不是关联的参数?
  • 您是否在users 资源中设置了自定义路由以转发到事件控制器? id 来自您说正确的路线。您在日志跟踪中看到的对 find_one 的调用在哪里?这是events 的用户模型吗?
  • 如果我要冒险出去,因为myevents 方法中几乎没有代码。我猜想Events 控制器上有一个before_action(或类似的东西)试图从参数哈希中的:id 查询一个事件。由于 :id 是从路由器开始设置为用户的 id 而不是事件的 id 那么你得到错误?
  • @access_user 正在应用程序控制器的方法中设置,该方法在 before_filter 中调用。它需要在 before_filter 中,否则它似乎不起作用 - 它无法识别例如current_user 否则。那可能是什么破坏了这个?

标签: ruby-on-rails json methods controller


【解决方案1】:

看到路线后,我想我知道发生了什么。您设置路由“成员”而不是路由“集合”。作为“成员”,它将始终尝试搜索在 id 中定义的事件(在这种情况下,由于路由中的 match 子句,该 id 实际上来自用户)。将您的路线更改为:

resources :events do
  collection do
    get 'myevents'
  end
end

这里有一个很好的答案:difference between collection route and member route in ruby on rails?

【讨论】:

  • 不幸的是,这没有奏效,我仍然遇到同样的问题。我如何明确定义我想要传递的参数,因为这似乎是这里的问题?感谢您的帮助。
  • 你得到完全相同的堆栈跟踪吗?它仍然以SELECT "events".* FROM "events" WHERE "events "."id" = ? LIMIT 1 [["id", "21"]] Completed 404 Not Found in 51ms 和ActiveRecord::RecordNotFound (Couldn't find Event with id=21): 结尾
  • 至于添加不同的参数,我认为您可以简单地将它们添加到您的源中(例如/users/&lt;%= @access_user.id %&gt;/events.json?event_id=&lt;%= some_id %&gt;&amp;callback'),但这无济于事,因为您的错误(除非它已经改变)是因为“ id" 参数正在使用中。
  • 我已将新跟踪添加到问题中。这次我以链接到用户帐户的访客身份登录。我确实希望在 json 回调中传递 id,因为它应该查找与该用户关联的所有事件。我认为当 json 循环通过 @events 时可能会出现错误,但也许我在 myevents 操作中将错误的东西定义为 @events?
  • 我已经接受了答案,因为它为我指明了正确的方向 - 感谢您的帮助。这实际上是 CanCan 中设置的功能的一个问题——我试图在ability.rb 中使用自定义操作(myevents)——只要我将该操作的授权移动到自定义授权方法,它就起作用了。所以是过滤器之前的康康康康康康舞曲把它搞砸了。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 2016-06-01
  • 2010-11-24
相关资源
最近更新 更多