嗨,我想通过说我是新手编码来序言。

我有一个我认为可以通过两种方式解决的问题

A.通过渲染部分

B.通过更新控制器

(我完全错了,但这些是我怀疑的大声笑)

我有两个控制器/视图“评论”和“日志”。我希望它们都出现在同一页面上。

我怎样才能做到这一点?我尝试渲染部分,但我一直出现错误。

我尝试了以下代码:

这使我的评论显示在页面上,但是当我添加时

@log = @user.logs.all 

为此,它并不像评论一样将所有日志拉到页面上。

def show
  @user = User.find_by_name(params[:id])
  if @user 
    @reviews = @user.reviews.all
    render action: :show
  else
    render file: 'public/404', status: 404, formats: [html]
  end
end
有帮助吗?

解决方案

首先。视图参考控制器中的操作。因此,每个控制器甚至没有几个视图。

所以,如果你想渲染 @reviews@logs 在同一页面上,您应该首先在同一操作中实例化两个实例变量,然后在同一操作中呈现两个部分。你是怎样做的?简单的。首先,您到达了您刚刚显示的控制器并编辑 show 行动。

def show       
  # You can set the variable in the if-clause 
  # And you also need to use static finders with a hash as an argument in Rails4
  if (@user = User.find_by(name: params[:id]))
     @reviews = @user.reviews.all 
     @logs = @user.logs.all
  # You don't need to call render explicitly 
  # if you render the view with the same name as the action 
   else
     render file: 'public/404', status: 404, formats: [html]
   end     
end

第二:你去你的 /app/views/reviews/show.html.erb 模板并将两个部分放在这样的地方(这只是一个示例,请调整标记以满足您的需求)。

<h1> Reviews and Logs</h1>
<div id="reviews_part">
 <%= render @reviews %>
</div>
<div id="logs_part">
  <%= render @logs %>
</div>

现在创建2个新部分 /app/views/reviews/_review.html.erb/app/views/logs/_log.html.erb 并将所有必要的标记放在那里(使用常规变量 reviewlog 向重复对象进行调整)。铁轨将根据需要自动重复这些部分。

或者您可以明确调用部分渲染

<div id="reviews_part">
  <% @reviews.each do |review| %>
   <%= render review %> 
        which is the same as
   <%= render partial:"reviews/review", locals:{review:review} %>
  <% end %>
</div>

其他提示

这是将部分渲染为HAML观点的方式:

=render :partial => "header"
%h2 Hello World
=render :partial => "footer"

您以这种方式渲染的每个部分,都必须在同一文件夹中创建。每个部分的名字必须从下划线开始(_)。这应该是视图的目录:

- home
    - index.html.haml
    - _header.html.haml
    - _footer.html.haml
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top