2013-03-19 2 views
2

Я установил службу Rails REST, и у меня возникла проблема с отображением одной записи. Вот URL, который я пытаюсь попасть КодRails Rest Service GET

http://website:3000/users/2/timesheets/21 

Контроллер:

def show 
    puts "SHOW" 
    puts params.inspect 
    @timesheets = User.find(params[:user_id]).timesheets(params[:id]) 

    respond_to do |format| 
     format.json { render json: @timesheets } 
    end 
    end 

Я знаю, что PARAMS получают в контроллер, но он не использует :timesheet_id. Вот консольный вывод, чтобы показать, что я имею в виду:

Started GET "https://stackoverflow.com/users/2/timesheets/21" for **.**.***.** at 2013-03-19 06:12:11 -0400 
Processing by TimesheetsController#show as */* 
    Parameters: {"user_id"=>"2", "id"=>"21"} 
    User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", "2"]] 
    Timesheet Load (0.5ms) SELECT "timesheets".* FROM "timesheets" WHERE "timesheets"."user_id" = 2 
Completed 200 OK in 120ms (Views: 36.5ms | ActiveRecord: 2.9ms) 

Я вижу идентификатор расписания 21 из параметров хэш. Затем выполняется запрос на получение пользователя, но затем все тайм-таблицы для этого пользователя захватываются. Любая помощь будет оценена по достоинству. Благодарю.

ответ

1

Попробуйте это:

@user = User.find(params[:user_id]) 
@timesheet = @user.timesheets.find(params[:id]) 

Это должно выполнить запрос следующим образом:

SELECT "timesheets".* FROM "timesheets" WHERE "timesheets"."id" = 21 AND ("timesheets"."user_id" = 2) LIMIT 1 

Соответствующий вид должен иметь в виду @timesheet переменной, а не @timesheets.

+1

Это сработало отлично. Я мог бы сделать все в одной строке: 'User.find (params [: user_id]). Timesheets.find (params [: id])'. Спасибо за помощь. – jhamm

4

Что предлагает Prakash, но выполняет два запроса: один, чтобы получить пользователя, а другой - получить расписание. Кажется, нет никакой причины делать User.find(...). Можно также запросить только таблицу расписаний, которая будет выполнять только один запрос и, таким образом, быстрее:

@timesheet = Timesheet.where('user_id = ? and id = ?', params[:user_id], params[:id]).first