質問

こんにちは、私はコーディングに慣れていないと言って、これを序文にしたいと思います。

私は2つの方法で解決できると信じている問題があります

A.部分的なものをレンダリングすることにより

B.コントローラーを更新することにより

(私は完全に間違っていることがありますが、これらは私が疑うものです笑)

2つのコントローラー/ビュー「レビュー」と「ログ」があります。そして、私は彼らが両方とも同じページに表示されたいです。

これどうやってするの?部分的なレンダリングを試みましたが、常にエラーが発生します。

そして、私は以下のコードを試しました:

それは私のレビューがページに表示されましたが、私が追加するとき

@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

2番目:あなたはあなたに行きます /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 繰り返しのオブジェクトをアドレスします)。 Railsは、必要に応じてそれらの部分を何度も繰り返します。

または、部分的なレンダリングを明示的に呼び出すことができます

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

他のヒント

これは、ハムルのビューに部分的なものをレンダリングする方法です:

=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