Я понятия не имею, с чего мне начать со следующего, что я хочу сделать.

У меня есть «Приветственная страница», где вошедшему в систему пользователю отображается список назначенных ему билетов.

В навигации он может перейти к «нормальному» списку билетов, где он получает список билетов, и если он выбирает один в отдельном контейнере div, представление _show этого единственного билета загружается с этим кодом:

Show.js.erb :

$("#current_ticket").html("<%= escape_javascript(render partial: 'tickets/show', locals: { ticket: @ticket } ) %>");

Теперь я хочу, чтобы, если пользователь нажимает на Ticket на своей странице приветствия, он переходит к ticket_path (который работает:

<td><%= link_to ticket.name, tickets_path %></td>

), и билет, по которому он щелкнул, загружается в контейнер div на этой странице Tickets_path.

РЕДАКТИРОВАТЬ:

Это шоу-часть контроллера билетов

def show
  @tickets = Ticket.all
  respond_to do |format|
    format.js {render layout: false}
  end
end

Вы можете помочь мне найти решение этой проблемы?

РЕДАКТИРОВАТЬ:

Извините, я думаю, вы неправильно поняли то, что я хотел вам сказать - возможно, из-за того, что я неправильно описал. У меня есть следующие представления (см. Скриншоты):

Страница приветствия:

Welcome Page

Билеты "указатель"

Tickets index

Если пользователь использует навигацию и нажимает на билеты, он направляется на страницу индекса билетов, где перечислены все билеты (обычно для приложений rails). Когда он теперь нажимает на тикет, данные тикета "показывают" рендерится как часть в блоке справа через jQuery (код, который я разместил выше).

Теперь я хочу, чтобы если пользователь находится на странице приветствия и нажимает на билет, он должен быть направлен на страницу индекса билетов (Tickets_path) -> работает, а билет, который он выбрал на своей странице приветствия, должен отображаться как partial в div, точно так же, как он работает, когда он переходит к билетам и выбирает там билет.

Вот в чем я борюсь.

С уважением, Маркус

1
mahu 20 Апр 2016 в 17:52

3 ответа

Лучший ответ

Я сам решил. В моем приветственном представлении я вызываю tickes_path с идентификатором билета, который хочу отобразить.

<td><%= link_to ticket.name, tickets_path(id: ticket.id) %></td>

В индексе контроллера билетов я нахожу этот билет и сохраняю его в переменной

  def index
unless params[:id].nil?
  id = params[:id]
  @ticket = Ticket.find(id)
end

Конец

И в представлении индекса билета я визуализирую партиал шоу с этим билетом из переменной

<div id="current_ticket">
  <% unless params[:id].nil? %>
      <%= render partial: 'tickets/show', locals: { ticket: @ticket } %>
  <% end %>
</div>

Ага!

1
mahu 25 Апр 2016 в 16:27

Чтобы заставить его работать:

  • Ваш link_to должен определять атрибут remote:

    & lt;% = link_to ticket.name, Tickets_path, remote: true% & gt;

  • Ваш show.js.erb использовал @ticket, но вы еще не определили его, я думаю, это неправильная опечатка, вы можете использовать вместо него @tickets

    $("#current_ticket").html("<%= escape_javascript(render partial: 'tickets/show', locals: { tickets: @tickets } ) %>");
    
  • И вы можете изменить tickets/show на использование tickets

Кстати, ваше действие странное, если вы ожидаете показать все билеты, действие будет index, show для показа a ticket. Вы можете провести рефакторинг!

1
Hieu Pham 20 Апр 2016 в 15:35

Похоже, вы путаете свой index и show методы. Метод индекса предназначен для получения всех билетов; метод шоу - получить один билет.

Вам необходимо передать билет по пути к заявке в операторе link_to. В методе show контроллера установите билет на связанный.

Контролер

def index
  @tickets = Ticket.all
  respond_to do |format|
    format.js {render layout: false}
  end
end

def show
  @ticket = Ticket.find(params[:id])
  respond_to do |format|
    format.js {render @ticket}
  end
end

В своей навигации вы должны прокручивать все билеты, и вы можете добавить ссылку на каждый билет. Вам нужно добавить remote: true к ссылке, чтобы rails знал, что нужно делать запрос ajax.

<% @tickets.each do |ticket| %>
  <%= link_to ticket.name, ticket_path(ticket), remote: true %>
<% end %>

Есть несколько способов добавить отдельный билет в представление. Вы можете использовать функцию js, чтобы добавить ее в div, или создать партиал js.erb. Посмотрите, сможете ли вы заставить вышеуказанное работать, и проверьте данные, возвращаемые в консоли, чтобы понять, как данные передаются.

0
margo 20 Апр 2016 в 15:50