【问题标题】:Rails 4 - Rendering partials instead of views in controller actionsRails 4 - 在控制器操作中渲染部分而不是视图
【发布时间】: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' %>,但无法访问 ReviewsControllerindex_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


【解决方案1】:

@stefvhuynh 是正确的。您已经实例化了 UsersController#show 方法,并且只获取了其中调用的实例变量。

您在向用户展示时需要的任何东西(实例变量)都应该在该调用中找到。你仍然可以使用局部视图来干燥你的视图。

【讨论】:

  • 谢谢,我明白了。我想我应该问的是“我怎样才能减少我的行动规模?”。拥有这么多实例变量不是一个坏习惯吗?你会说这很重要,还是只是在我需要访问这些模型时才需要?
  • 如果你需要渲染你的视图,那么就使用你需要的。当您需要访问权限时,您需要访问权限。将来,当您知道如何使用您的应用程序时,您可以进行重构以更适合您的用户。
猜你喜欢
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2014-11-26
  • 2012-11-06
  • 2013-04-26
相关资源
最近更新 更多