Рендеринг частичного из JavaScript, проблема с передачей переменных класса - PullRequest
1 голос
/ 04 декабря 2011

Я пытаюсь настроить вид с бесконечной прокруткой. Я делаю это с помощью частичной загрузки javascript, но проблема в том, что мне нужно передать переменную @row (см. Ниже), чтобы вычислить, какие объекты загрузить.

Переменная @row не загружается, когда партиал вставляется через js ниже.

Неправильно ли я подхожу к этой проблеме (есть более простой способ вставить объекты rails) или есть способ передать переменную @row в партиал из js.

Контроллер:

respond_to do |format|
  format.html
  format.js
end

JS загружается из ответа контроллера выше:

$(' #{render "shared/browse_row" ).insertAfter( $('.row') );

Вид:

-(1..6).each do
    = render "shared/browse_row"

Частично browse_row:

.row{'data-row'=> "#{@row}"}
-@row += 1
%ul
    -@i = 0
    -project_row( @row ).each do |project|
        -@i += 1
        -@i == 4 ? right = "right" : right = ""
        %li{:class => right}
            = image_tag( project.display_pic.url(:medium) )
            .filler{'data-link' => '/projects/'+project.id.to_s }
                .filler-text
                    .p-name
                        = project.name
                        .p-creator= "by " + project.creator.name
                    .p-price= "$" + number_with_precision(project.price, :precision => 2).to_s
                    .p-days
                        - if days_left( project ) > 0
                            ="Expires in " + pluralize( days_left( project ), " Day")
                        - else
                            ="Expires Today"
                    .p-percent
                        - percent_funded(project).gsub("%","").to_i > 100 ? percent = "100%" : percent = percent_funded(project)
                        .p-percent-bar{:style => "width:#{ percent };"}

1 Ответ

3 голосов
/ 05 декабря 2011

Вы должны передать переменную экземпляра @row в партиал, когда вы визуализируете ее, используя следующий синтаксис:

render :partial => "shared/browse_row", :locals => { :row => @row }

Затем она будет доступна в файле партиции browse_row как переменная с именем * 1006.*

Итак, вы просто измените это на следующее:

.row{'data-row'=> "#{row}"}

В будущем вы можете захотеть сделать что-то еще подобное ...

В ссылке для загрузки других проектов:

<a href="path_to/more_projects" class="get-new-projects" data-remote="true" data-method="GET">Load more projects</a>

В вашем файле контроллера:

def show
  row = params[:row]
  @projects = Project.where('id > ?', row)  

  render :json => { :projects => render_to_string( :partial => 'shared/browse_row.html',
                                                   :locals => { :row => row }) }, 
         :status => :ok
end

Затем в вашем успешном обратном вызове ajax:

$('.get-new-projects').live('ajax:success', function(data, json, response) {
  // insert the rendered HTML that we passed in as a JSON string
  $('.row').after(json.projects);
});

ThisКстати, вы держите все красиво и организованно.Ваш бэкэнд рендерит код, ваш интерфейс помещает рендеринг кода туда, где он должен быть на странице ... все довольны.

...