2017-01-15 7 views
0

私はこれでいくつかの助けが必要です。レール、ページのリンク

私は投稿に属する«候補»を持っています。 (各投稿には異なる候補があります)。

特定の投稿をクリックすると、候補者を表示することができます。

私はこれをリンク/ルーティングする方法がわかりません。私はインデックスページとして«posts»を持っていて、投稿をクリックして対応する候補を持っていたいと思っています。 私は参照として競合相手にpost_idを追加しました。しかし、私はそれが正しいことであるかどうかも分かりません。

ありがとうございます!

PS:それが何か変わるかどうかわかりませんが、ActiveAdminをバックエンドとして、Carrierwaveを使って画像をアップロードしようとしています。

ポスト/ index.html.erb

<div class="container"> 

     <div class="row"> 

      <div class="col-lg-12"> 
       <h1 class="page-header">Your poll app</h1> 
      </div> 
      <% @posts.each do |post| %> 
      <div class="col-lg-3 col-md-4 col-xs-6 thumb"> 
       <a class="thumbnail" href="#"> 
        <%= post.name %> 
        <br> 
        <%= post.id %> 
        <%= link_to "Contenders", post_contenders_path(post.id) %> 
        <img class="img-responsive" src="" alt=""> 
        <%= image_tag post.image_url %> 
        </img> 
       </a> 
      </div> 
      <% end %> 
     </div> 
</div> 

候補/ index.html.erb

class ContendersController < InheritedResources::Base 
    def index 
     @contenders = Contender.all 
    end 

    def new 
     @contender = Contender.new 
    end 

    def create 
     @contender = Contender.new(post_params) 

     if @contender.save 
      redirect_to posts_path, notice: "The contender #{@contender.name} has been uploaded." 
     else 
      render "new" 
     end 

    end 

    def destroy 
     @contender = contender.find(params[:id]) 
     @contender.destroy 
     redirect_to posts_path, notice: "The post #{@contender.name} has been deleted." 
    end 

     private 
     def post_params 
     params.require(:contender).permit(:name, :image) 
     end 

    private 

     def contender_params 
     params.require(:contender).permit(:name, :image, :post_id) 
     end 
end 

コントローラ/ contenders_controllers.rb

class ContendersController < InheritedResources::Base 
    def index 
     @contenders = Contender.all 
    end 

    def new 
     @contender = Contender.new 
    end 

    def create 
     @contender = Contender.new(post_params) 

     if @contender.save 
      redirect_to posts_path, notice: "The contender #{@contender.name} has been uploaded." 
     else 
      render "new" 
     end 

    end 

    def destroy 
     @contender = contender.find(params[:id]) 
     @contender.destroy 
     redirect_to posts_path, notice: "The post #{@contender.name} has been deleted." 
    end 

     private 
     def post_params 
     params.require(:contender).permit(:name, :image) 
     end 

    private 

     def contender_params 
     params.require(:contender).permit(:name, :image, :post_id) 
     end 
end 

ターミナル

は、2017年1月16日20時22分16秒0000 処理で127.0.0.1のために、 "/ポスト/ 10 /候補を" GET開始コントローラ/ posts_controllers.rb

class PostsController < ApplicationController 
    def index 
     @posts = Post.all 
    end 

    def new 
     @post = Post.new(params[:id]) 
    end 

    def create 
     @post = Post.new(post_params) 

     if @post.save 
      redirect_to posts_path, notice: "The post #{@post.name} has been uploaded." 
     else 
      render "new" 
     end 

    end 

    def destroy 
     @post = Post.find(params[:id]) 
     @post.destroy 
     redirect_to posts_path, notice: "The post #{@post.name} has been deleted." 
    end 

    private 
     def post_params 
     params.require(:post).permit(:name, :image) 
    end 

end 

{ "post_idの" => "10"}レイアウト内 レンダリング候補/ index.html.erb /アプリケーション テンダーロード(0.5ミリ秒)
SELECT "候補" *「候補FROM:HTML パラメータとしてContendersController位インデックスによって" レンダリングした候補s/index.html.erb内のレイアウト/アプリケーション(2.8ms) 177msで200 OK完了(Views:172.9ms | ActiveRecordの:0.5msの)

は、レイアウト内のHTMLレンダリング ポスト/ index.html.erbとしてPostsControllerの番号インデックスによって2017年1月16日午後8時35分30秒0000 処理で127.0.0.1のための "/" GET開始しました/アプリケーション 投稿負荷(1.0ms)
SELECTより "投稿" 投稿/ index.html.erb内のレイアウト/アプリケーション(25.3ms) 完了しました322msで200 OK(閲覧回数:310.8ms |アクティブレコード:1.0ms)

私はコードを編集しました。そして、それでも正しいことは示されません。

ポスト/ index.html.erb

<div class="container"> 
     <div class="row"> 
      <div class="col-lg-12"> 
       <h1 class="page-header">Your poll app</h1> 
      </div> 
      <% @posts.each do |post| %> 
      <div class="col-lg-3 col-md-4 col-xs-6 thumb"> 
       <a class="thumbnail" href="#"> 
        <%= post.name %> 
        <br> 
        <%= post.id %> 
        <%= link_to "Contenders", post_contenders_path(post_id: post.id) %> 
        <img class="img-responsive" src="" alt=""> 
        <%= image_tag post.image_url %> 
        </img> 
       </a> 
      </div> 
      <% end %> 
     </div> 
</div> 

候補/ index.htmlを。ERB

<div class="container"> 

     <div class="row"> 

      <div class="col-lg-12"> 
       <h1 class="page-header"> 
       Test 
       </h1> 
      </div> 
      <% @contenders.each do |contender| %> 
      <div class="col-lg-3 col-md-4 col-xs-6 thumb"> 
       <a class="thumbnail" href="#"> 
        <%= contender.name %> 
        <br> 
        <%= contender.post_id %> 
        <img class="img-responsive" src="" alt=""> 
        <%= image_tag contender.image_url %> 
        </img> 
       </a> 
      </div> 
      <% end %> 
     </div> 
</div> 

コントローラ/ contenders_controllers.rb

class ContendersController < InheritedResources::Base 
    def show 
     @post = Post.find_by(id: params[:post_id]) 
     @contenders = @post.contenders 
    end 

     private 
     def post_params 
     params.require(:contender).permit(:name, :image) 
     end 

    private 

     def contender_params 
     params.require(:contender).permit(:name, :image, :post_id) 
     end 
end 

コントローラ/ posts_controllers.rb

class PostsController < ApplicationController 
    def index 
     @posts = Post.all 
    end 
    def show 
     @post = Post.find_by(id: params[:post_id]) 
     @contenders = @post.contenders # Assuming that they have a has_many/belongs to relationship. 
    end 

    private 
     def post_params 
     params.require(:post).permit(:name, :image) 
    end 

end 

routes.rbを

Rails.application.routes.draw do 
    resources :contenders 
    resources :users 
    devise_for :admin_users, ActiveAdmin::Devise.config 
    ActiveAdmin.routes(self) 
    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
    resources :posts do 
    resources :contenders 
    end 
    root "posts#index" 

end 

+0

あなたは、あなたがContenderController#indexからレンダリングしていることを示しています。これは '@contenders = Contender.all'というコードを持っています。そのため、すべての候補をレンダリングしています。スコープを設定する場合は、まず、 '@ post'を':post_id'で見つけて、その投稿のすべての候補を呼び出します。私はこれを 'show'メソッドの下の私の答えに示します。 contenders_controllerのindexアクションでも同じことができます。私は編集を投稿します。試してみてください。 :-) –

+0

こんにちはJamesさん、コードを更新しました。しかし、まだ何かが見つからないと思っています。:( – Benjamin

+0

端末の出力はまだ同じですか?別の場合は新しい出力をペーストできますか?あなたの 'rake routes'出力をペーストできますか?また、この<%= link_to post_path(post.id)%> 'のように表示ページに移動します。'@post = Post.find_by(id:params [:post_id]);を入れてみましたか? @ contenders = @ post.contenders'コードは 'contenders_controller#index'にありますか? –

答えて

0

あなたは、ネストされたURLを持つようにしたい場合は、あなたはこのようになりますあなたのroutesファイルで何かが必要になります。

# routes.rb 
resources :posts do 
    resources :contenders 
end 

をしてからposts_controllerであなたのshow方法があることができるようにしたいです特定のpostcontendersのインデックス、右?

ので、ショーの方法では、あなたはコントローラが:post_idとの記事を検索し、このように、そのポストのための候補を一覧表示する必要があるだろう:ビューについては

# posts_controller.rb 
def show 
    @post = Post.find_by(id: params[:post_id]) 
    @contenders = @post.contenders # Assuming that they have a has_many/belongs to relationship. 
end 

、あなたは次のようになりあなたはそれを適切にリンクしています。コマンドラインでrake routesを実行すると、アプリケーションが描画したルートの出力を取得できます。最初の列は、ルートで呼び出すことができる名前のリストです。 3列目には、:idまたは:post_idなどの動的パーツのURLが表示されます。これらの情報は、その情報を経路に渡す必要があることを示しています。

あなたのindexアクションになり/posts/:post_id/contendersのようなURLを、持っているのであれば、あなたはこのようになりますlink_to持っている必要があります。

<% @posts.each do |post| %> 
    ... 
    <%= link_to 'Post', post_contenders_path(post_id: post.id) %> 
    ... 
<% end %> 

次に、あなたの競争では、あなたがしたいページを表示上記の@contenders変数を使用してください。

これがどのようになったのか教えてください。

EDIT:

post#showとは対照的に、あなたがcontenders#indexをレンダリングしているようです。この方法でやりたいのであれば、競争相手のインデックスアクションを投稿の対象にすることができます。同様に:

# controllers/contenders_controller.rb 
def index 
    @post = Post.find_by(id: params[:post_id]) 
    @contenders = @post.contenders 
end 
+0

Jamesさんにお返事いただきありがとうございますが、残念ながらまだ私のために働いていません。 基本的には、メインページにすべての投稿を載せたいと思います。私が投稿をクリックすると、その投稿に関連する候補ページに行きたいと思います。例えばだから、 : メインページ:ポストA、B、C、D、など 私はポストBをクリックすると、私は、 'だけ私はB. を投稿する関連候補を表示するページに行きますまた、ショーとインデックスメソッドの違いを理解することに問題があります。 (私はショーの方法を持っていなかった)。 ありがとう! – Benjamin

+0

ちなみに、あなたは "link_to 'Post'"を使っていましたが、私はそれがちょうどtypoなのか疑問に思っていました。 – Benjamin

+0

まず、 'show'ページには、オブジェクトとそのオブジェクトについて表示したい情報が表示されます。この場合、1つの投稿を表示する必要があり、その投稿には複数の候補が関連付けられます。だから、 'def show ....'メソッドでは、posts_controllerの中でスコープを '@ post'に制限しています。その後、投稿に関連するすべての候補を '@ post.contenders'と呼んでいます。 –

関連する問題