我们假设我有UserProfileController#show
呈现用户的个人资料帐户页面。此控制器的关联视图和部分位于/app/views/user_profile/*
与任何UserProfile页面一样,用户应该能够编辑他们的首选项。通过单击触发UserPreferences#show
的首选项链接来完成此操作,并通过在/app/views/user_preferences/*
我目前的问题是后一页是一个完整的单独页面,我必须链接到该页面。我喜欢能够在不离开用户个人资料页面的情况下调出模式中的首选项页面。或者也许我只是希望它嵌入在底部的配置文件页面中(即它不一定必须是一个弹出模式 - 没有寻找特定的答案)。
问题是我无法从当前的UserProfileController
视图调用全新的控制器和操作。有没有办法调用这条新路线并让它在我当前的页面中生成整个新页面?
我到目前为止唯一得到的答案是我应该考虑从同一个控制器中完成所有操作,但这真的超载UserProfileController
并且我的操作方法变得漫长而凌乱。
谢谢!
答案 0 :(得分:3)
你在想错了;您不是在处理“网页”,而是处理controller
行为和views
。微妙但重要的区别:
Rails本身是 MVC ( M odel V iew C ontroller)框架。它在这个意义上并不是唯一的,但由于许多Rails开发者没有其他地方的经验,他们必须亲自学习MVC的“心态”。
正如您在上面所看到的,您不能简单地渲染“页面”并查看所需的所有数据。您需要使用数据填充视图(在控制器中完成),允许Rails在浏览器中发送相关的HTML等。
因此,你必须问自己你将如何:
user_preferences
视图<强> 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并按需下载整个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