Исключить макет приложения в Rails 3 div

Я загружаю шаблон profile_messages как часть вкладок пользовательского интерфейса jQuery с помощью Ajax. Однако при загрузке profile_messages наследует макет приложения моего сайта (верхний и нижний колонтитулы, все). Я пытался сделать это частично, но тогда ничего не получилось. Поэтому мне интересно, есть ли способ сделать это.

jQuery в моем application.js:

$(function() {
    $( "#tabs" ).tabs({
        ajaxOptions: {
            error: function( xhr, status, index, anchor ) {
                $( anchor.hash ).html(
                    "There was an error loading this tab. Please try again." );
            }
        }
    });
});

Routes.rb:

resources :profiles do
  get :profile_messages, :on => :collection
end
match "/profiles/profile_messages" => "profiles#profile_messages"

My profiles#show.html.erb:

<div id="tabs">
  <ul id="infoContainer">
    <li><a href="#tabs-1">About</a></li>
    <li><%= link_to "Messages", '/profiles/profile_messages/', :id => 'qs', :remote => true %></li>
  </ul>
  <div id="tabs-1">
  </div>
</div>

Мой шаблон profile_messages:

<div id="tabs-2">
<% for message in @user.messages %>
<% end %>
</div>

My profile_messages.js.erb:

$( "#tabs" ).html( "<%= escape_javascript( render(@profile.messages) ) %>" );

Мой метод profile_messages в profiles_controller.rb:

def profile_messages
  @profile = User.find(user.id).profile #need to fix so @profile is defined for each profile, not just the current_user profile
  @messages = User.find(@profile.user_id).messages
  respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @messages }
  end
end

Так есть ли способ обойти макет приложения?

ОБНОВЛЕНИЕ: я заставил макет исчезнуть, вставив следующее в свой profile_messages

def profile_messages
  @profile = User.find(user.id).profile
  @messages = User.find(@profile.user_id).messages
  respond_to do |format|
    format.html { render :layout => nil }
    format.xml  { render :xml => @messages }
  end
end

ОБНОВЛЕНИЕ 2: я попытался отрендерить часть, но это не сработало. Вот что я изменил в своем profiles#show.html.erb:

<div id="tabs">
  <ul id="infoContainer">
    <li><a href="#tabs-1">About</a></li>
    <li><%= link_to render(:partial => 'profiles/profile_messages'), :id => 'qs', :remote => true do %>Messages<span>&nbsp;</span><% end %></li>
  </ul>
  <div>
  </div>
</div>

Однако это загружает частичное в <ul id="infoContainer">


person tvalent2    schedule 08.10.2011    source источник


Ответы (2)


В контроллере добавьте в конце действия «show»:

render :layout => nil

Или, если вы выполняете рендеринг из другого места, просто добавьте параметр :layout => nil для рендеринга.

Лучшим решением было бы сделать его частичным и вызвать render :partial => "profile_messages/profile_message" (если у вас есть шаблон в app/views/profile_messages/_profile_message.html.erb - обратите внимание на _ в имени файла!)

Кроме того, вместо использования escape_javascript на самом деле проще отказаться от кавычек и использовать (render...).to_json.

person mrbrdo    schedule 08.10.2011
comment
Мне удалось исправить проблему с макетом приложения. Однако не могли бы вы добавить немного кода, чтобы показать, как вызывать render :partial? Я хотел бы попробовать это. Как вы можете видеть в обновлении, которое я пробовал, но оно не сработало (даже после изменения моего шаблона на _profile_messages.html.erb). - person tvalent2; 09.10.2011
comment
Вы не можете ссылаться на партиал таким образом. Здесь я имел в виду визуализацию :partial $( #tabs ).html( ‹%= render(:partial =› profile_messages/profile_message, :collection =› @profile.messages).to_json %› ); - person mrbrdo; 18.10.2011

У вас есть формат ответа JS, определенный в вашем контроллере? Он не должен отображать макет, если он правильно отображает ответ JS. В ваших журналах отображается «ответ в формате JS»?

respond_to do |format|
  format.js
end

Как уже упоминалось mrbrdo, вы также можете выполнить render :layout => false, но в этом нет необходимости, если ответ JS выполняется правильно.

person Kristian PD    schedule 08.10.2011
comment
Это важно, потому что он вызывает рендер внутри представления. Я не думаю, что этот рендер будет знать о формате. Поэтому, если он не отображает profile_messages как партиал в этом представлении (что он и должен делать), ему нужно использовать этот параметр макета. - person mrbrdo; 08.10.2011