Rails 4: создать пользовательский объект в контроллере

Я пытаюсь создать провайдер для oEmbed в Rails 4 Создаются маршрут, контроллер и действие.

Но я не могу создать объект с параметрами, которые нужны для oembed (например, тип, версия, html,...)

Я пытался сделать это следующим образом:

class ServicesController < ApplicationController

    def oembed
        # get project ID
        url = params[:url].split("/")
        project_id = url[4]

        @project = Project.find(project_id)
        html = render_to_string :partial => "projects/oembed", :formats => [:html], :locals => { :project => @

        # here's the problem:
        oembed_response["type"] = "rich"
        oembed_response["version"] = "1.0"
        oembed_response["title"] = @project.name
        oembed_response["html"] = html

        respond_to do | format |
            if(@project)
                format.html { render :text => "Test" }
                format.json { render json: oembed_response, status: :ok }
                format.xml { render xml: oembed_response, status: :ok }
            else
                # error
            end
        end
    end
end

Я всегда получаю следующую ошибку:

NameError (неопределенная локальная переменная или метод oembed_response' for #<ServicesController:0x007f9a8be579a0>): app/controllers/services_controller.rb:11:inoembed'

Как я могу добиться создания пользовательского объекта с необходимыми атрибутами без модели и (строгих) параметров, как это обычно делается?

Я что-то упускаю?

Заранее спасибо!

С уважением,

Крис


person lehnerchristian    schedule 01.06.2014    source источник


Ответы (1)


Сначала инициализируйте oembed_response как пустой хэш:

oembed_response = {}

Не связано с этой ошибкой, но вам следует изменить способ получения URL-адреса объекта из идентификатора. Маршруты должны автоматически анализировать идентификатор для вас, например. когда у вас есть это в файле routes.rb:

get "/projects/oembed/:id" => 'services#oembed'

Затем вы можете получить доступ к идентификатору (данному :id в пути маршрутов) напрямую из хэша параметров:

project_id = params[:id]
person joni    schedule 01.06.2014
comment
Через 3 минуты - надо подождать ;) - person lehnerchristian; 02.06.2014
comment
К части под пустым хэшем: как это могло работать? потому что обычно у меня, например, /projects/1 --› с этой URL-схемой /:id работает в маршрутах. но с oEmbed я получаю запрос типа http://example.com/services/oembed?url=http://example.com/projects/4/&format=json, не так ли? - person lehnerchristian; 02.06.2014
comment
Но теперь у меня есть решение получше: parsed_url = Rails.application.routes.recognize_path params[:url]. Затем можно вызвать функцию .find с помощью parsed_url[:id]. Просто если у кого-то такая же проблема ;) - person lehnerchristian; 03.06.2014