2016-03-21 2 views
3

Я хотел бы, чтобы мой пользователь щелкнул ссылку «Bio», расположенную на странице своего профиля, которая отобразит их био-содержимое, вытащенное из базы данных. Для этого я создал частичную lovelies/_bio.html.erb, потому что я хотел бы загружать «пользовательскую биографию» на их страницу «Страница профиля», а не отправлять их на другую страницу.Как сделать частичное использование link_to с рельсами 4.2.2

В настоящее время частичный не может быть найден. Это мой код ниже.

В моем файле routes.rb, я создал путь URL-адрес для био действий, который переводит к

bio_lovely_path url -> /lovelies/:id/bio 

Это делается таким образом, так как мне нужно, чтобы получить информацию этого конкретного пользователя я его создал, как участник.

конфигурации/routes.rb

resources :lovelies do 
    member do 
    get 'bio' 
    end 
end 

Моя ссылка находится в моих макетах/_header.html.erb

if logged_in? 
    <li class="header-log"><%= link_to "Bio", bio_lovely_path, :remote => true %></li> 
else 
//display none logged in links 
<%end%> 

Мой контроллер, где у меня есть действие называется

LovelyController, биоактивность определяется следующим образом:

// отображение текущего пользователя bio

def bio 
     @lovely = Lovely.find(params[:id]) 
     respond_to |format| 
     format.js 
     end 
    end 

У меня есть вызов JQuery в моем файле lovelies.coffee для визуализации с/_bio.html.erb красотки частичного к DIV в моей красотке/show.html.erb

jQuery ->$('#partial).html '<%= escape_javascript(render 'bio') %> 

Моего выход говорит, что выдает ошибку 500 - Не удалось загрузить ресурс.

Я понимаю, что jQuery добавляет, что html к <div> в show.html.erb обрабатывает его как ruby ​​и должен приводить к визуализации _bio.html.erb. Я новичок в Rails и буду очень благодарен за предложения и рекомендации относительно того, как решить эту проблему. Thanks

ответ

2

Похоже, что вы пытаетесь сделать вызов AJAX в Rails, судя по :remote => true в ссылке helper. Вы почти там; однако вы не совсем делаете то, что ожидает Rails.

Когда ссылка, которая выглядит следующим образом

= link_to 'Bio', bio_lovely_path(@lovely), :remote => true 
# small change from the code you gave - because your path `lovelies/:id/bio` 
# has `:id` in it, you must provide the object you are referring to, `@lovely`. 
# in fact, this is probably where your 500 error came from. 

щелкают, это как будто это вызывает вызов AJAX, как так:

// you don't have to write this; `:remote => true` ensures that it gets done 
// for you. 
$.ajax({ 
    url: '/lovelies/<@lovely.id>/bio', 
    type: 'get', 
    dataType: 'script' 
}) 

Это поражает ваше действие lovelies#bio контроллера в качестве типа js данных. Вы поступили правильно, указав respond_to формат js. Это позволит отобразить файл js. То есть, в конце действия контроллера, Rails будет искать соответствующий файл js.erb для выполнения. (Как правило, он ищет html.erb файла, но у вас есть, с помощью :remote => true, сказал его использовать код JavaScript на этот раз.)

приложение/просмотров/красотки/bio.js.erb

$('#partial').html('<%= escape_javascript(render(partial: "bio.html.erb")).html_safe %>'); 

Раньше у вас был примерно этот код в lovelies.coffee, который не будет работать. Во-первых, Rails не будет знать, чтобы выполнить его после действия контроллера. С другой стороны, файлы в папке assets ограничены в своих возможностях ERB (хотя они могут сделать немного, если вы дадите им расширение .erb).

Вы можете использовать CoffeeScript, .coffee.erb, если хотите. Однако я не знаю особенностей этого; Я избегаю CoffeeScript, когда смогу.


Теперь, когда я пытался объяснить процесс AJAX при использовании Rails :remote => true атрибут, позвольте мне предложить альтернативу. Недавно я узнал, что для задачи, столь же простой, как вставка еще нескольких элементов в страницу, обычно проще просто включить их в первую очередь. Скройте их, указав свой контейнер на свойство CSS display: none, а затем откройте их при нажатии кнопки с помощью jQuery's .slideDown() или чего-то подобного. Это позволит вам пропустить маршрутизацию, действие контроллера, файл js.erb и все, что хлопот.

В принципе, я бы рекомендовал (большую часть времени) сохранить причудливые вызовы AJAX в Rails для того, когда вам нужно удалить, создать или обновить. Обычно не стоит динамически добавлять немного дополнительной информации на страницу, когда есть более простой способ.

1

Частичный должен быть представлен как часть другой страницы, используя render partial: 'name_of_partial' в другом файле. Тем не менее, ваш контроллер имеет метод bio, для которого необходим файл bio.html.erb для рельсов, который будет использоваться для основной биостраницы на этом пути. Обратите внимание на отсутствие подчеркивания в начале имени файла.

Либо используйте другую страницу и отрисуйте частичный в ней _bio.html.erb (и у вас нет отдельного пути), либо у вас есть страница, предназначенная только для биографии.

1

Найдено простое решение

  1. создать контейнер для хранения тонированное частично.
  2. Используйте события Coffeescript, чтобы вызвать частичное изображение, которое будет отображаться после нажатия соответствующего идентификатора.

HTML файл - // кнопка мыши и отображения био на странице

<button id="display-bio">Lovely Bio </button> 

// ДИВ, который отображает био на странице

<div id="bio" style='display:none'> 
    <%= render 'layouts/bio'%> 
</div> 

код в CoffeeScript

// код в сценарии кофе для запуска события

$('#display-bio).click -> 
    $('#bio).show() 

Я думаю, что это довольно просто.

Смежные вопросы