【发布时间】:2014-10-23 01:06:49
【问题描述】:
这是来自我的 UsersController 的显示操作,我将其用于我网站上每个用户的个人资料视图:
def show
user = User.find(params[:id])
@conversations ||= user.mailbox.inbox.all
@active_requests = user.requests.all.select { |r| r.request_complete == nil }
@completed_requests = user.requests.all.select { |r| r.request_complete != nil }
@reviews_received = Review.received_by_user(user)
@reviews_given = Review.given_by_user(user)
respond_to do |format|
format.html
format.json
end
end
如您所见,我在这一操作中访问了四种不同的模型。我想在自定义操作中将这些实例变量声明移动到每个模型各自的控制器中。
我需要以某种方式为每个动作附加一个部分,然后我将在users/show.erb 视图中呈现它。
我不知道如何渲染一个局部并将该局部“附加”到一个动作上,以便它可以访问该动作的实例变量。这是我所做的 到目前为止,Review 模型:
我在ReviewsController 内部创建了一个动作index_reviews_received,而这个部分:reviews/_index_reviews_received.erb。
在users/show.erb里面,我试过了
<%= render 'reviews/index_reviews_received' %>,但无法访问 ReviewsController 中 index_reviews_received 操作中的 @reviews_received 实例变量。
reviews/_index_reviews_received.erb
<% @reviews_received.each do |received| %>
<%= received.feedback %>
<%= received.rating %>
...
<% end %>
评论控制器
def index_reviews_received
#not actual query, just keeping it simple while I figure this out.
@reviews_received = Review.all.limit(10)
end
审核路线
resources :reviews do
collection do
get :index_reviews_received
get :index_reviews_given
end
end
如果您认为我的做法有误,请告诉我。谢谢!
【问题讨论】:
-
如果我错了,请纠正我,但您似乎正在尝试在 users/show.erb 中呈现评论/_index_reviews_received.erb。虽然您可以这样做,但您不会从 ReviewController 获取实例变量,因为您永远不会实例化 ReviewsController 并调用适当的操作。当您导航到 localhost:3000/users/123 时,您(希望)正在路由到 UsersController 中的 show 操作,仅此而已。只有当您导航到 localhost:3000/reviews/index_reviews_received 时,您才会实例化 ReviewsController 并调用创建实例 var 的操作。
标签: ruby-on-rails ruby