如何在当前视图中呈现另一个页面(Controller Action + View)

时间:2015-09-21 07:02:43

标签: jquery ruby-on-rails views controllers

我们假设我有UserProfileController#show呈现用户的个人资料帐户页面。此控制器的关联视图和部分位于/app/views/user_profile/*

与任何UserProfile页面一样,用户应该能够编辑他们的首选项。通过单击触发UserPreferences#show的首选项链接来完成此操作,并通过在/app/views/user_preferences/*

下呈现视图来显示整个新页面

我目前的问题是后一页是一个完整的单独页面,我必须链接到该页面。我喜欢能够在不离开用户个人资料页面的情况下调出模式中的首选项页面。或者也许我只是希望它嵌入在底部的配置文件页面中(即它不一定必须是一个弹出模式 - 没有寻找特定的答案)。

问题是我无法从当前的UserProfileController视图调用全新的控制器和操作。有没有办法调用这条新路线并让它在我当前的页面中生成整个新页面?

我到目前为止唯一得到的答案是我应该考虑从同一个控制器中完成所有操作,但这真的超载UserProfileController并且我的操作方法变得漫长而凌乱。

谢谢!

2 个答案:

答案 0 :(得分:3)

你在想错了;您不是在处理“网页”,而是处理controller行为和views。微妙但重要的区别:

enter image description here

Rails本身是 MVC M odel V iew C ontroller)框架。它在这个意义上并不是唯一的,但由于许多Rails开发者没有其他地方的经验,他们必须亲自学习MVC的“心态”。

正如您在上面所看到的,您不能简单地渲染“页面”并查看所需的所有数据。您需要使用数据填充视图(在控制器中完成),允许Rails在浏览器中发送相关的HTML等。

因此,你必须问自己你将如何:

  1. 填充user_preferences视图
  2. 的数据
  3. 在浏览器中渲染该视图
  4. <强> Partials

    您可能需要的功能是 partials

    Partials允许您在主视图中调用“子视图”。您必须为其提供数据等,但这意味着您可以在其他视图中呈现菜单和配置文件等内容,每次重复使用相同的代码(DRY - Don't Repeat Yourself)。

    部分创建简单 - 只需在其名称前加下划线:

    #app/views/user_preferences/_menu.html.erb
    This is a user preferences partial.
    You can call this in any view but make sure you have the correct data supplied!
    

    现在,重要的部分在于你如何调用这个部分:

    #app/views/user_profile/index.html.erb
    <%= render "user_preferences/menu", locals: {user: @user} %>
    

    您可以在@user控制器中填充Users变量:

    #app/views/user_profiles_controller.rb
    class UserProfilesController < ActionController::Base
       def index
          @user = User.find x
       end
    end
    

    -

    Ajax

    另一种方法是使用Ajax并按需下载整个user_preferences视图。我不建议这个例子。

    Ajax基本上是从浏览器向服务器发送异步(并行)请求。然后将收到的响应附加到页面。它用于提供功能片段(加载用户数据等)。

    Ajax使用Javascript,必须这样做:

    #app/assets/javascripts/application.js
    $(".some_button").on("click", function() {
        $.ajax({
            url: "path/to/user_preferences",
            success: function(data) { // do something here }
        });
    });
    

答案 1 :(得分:1)

正如您的问题所示,您确实拥有与用户关联的控制器,并且在该页面上您可以轻松获得user个对象。

因此,您应该使用userprofile控制器的show动作来获取userprofile的信息。在show视图中你应该有一些div在页面加载时触发ajax调用,如下所示:

#show.html.erb

.....your user profile html....
<div id="user_prefrences" data-id="#{@user.id}"></div>
.....your user profile html....

并在你的js文件中进行了更改。

$(function(){
  var id = $('#user_prefrences').attr('data-id') ## get user id here
  $.ajax({
    url: '/user_prefrences/' + id, 
    success: function(result){
      $("#user_prefrences").html(result);
    }
  });
});

在你的控制器中记得检查ajax请求并发送没有布局的数据。

## UserPrefrences Controller

def show
  if request.xhr?
    ....
    layout false
  else
  end
end