2017-01-15 114 views
0

我需要一些帮助。Rails,链接页面

我有«竞争者»属于帖子。 (每个职位有不同的竞争者)。

我希望能够显示竞争者,当我点击某个职位。

我不知道如何链接/路由此。我希望将«帖子»作为我的索引页面,并且能够点击任何帖子并拥有相应的竞争者。 我添加了一个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 

控制器/ 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 

终端

发起者在2017年1月16日20时22分十六秒0000 处理GET为127.0.0.1 “/帖/ 10 /竞争者”通过ContendersController#指数为HTML 参数:{ “POST_ID”=> “10”}布局内 渲染竞争者/ index.html.erb /应用 竞争者负荷(0.5毫秒)
SELECT “竞争者” * FROM“竞争者。 “ 呈现竞争者(2.8ms) 在177ms内完成200行(查看:172.9ms | ActiveRecord的:0.5ms的)

入门使用 “/”,用于PostsController#指数HTML 在2017年1月16日20点35分三十秒+0000 处理127.0.0.1渲染帖子/布局内index.html.erb 。/应用 后装载(1.0ms的)
SELECT “上岗” * FROM “上岗” 渲染帖子/布局内index.html.erb /应用(25.3ms) 完成200 OK在322ms(浏览次数:310.8ms | ActiveRecord: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#指数呈现。其中代码为'@contenders = Contender.all',所以这就是渲染所有竞争者的原因。如果你想限制它,首先用':post_id'找到'@ post',然后调用该帖子的所有竞争者。我在'show'方法下面的回答中显示了这一点。你可以在contenders_controller索引操作中做同样的事情,我会发布一个编辑。试试看。 :-) –

+0

嗨,詹姆斯,我已经更新了代码。但是我想还是有一些东西丢失.. :( – Benjamin

+0

终端输出仍然是相同的吗?如果它不同,你可以粘贴新的输出吗?你可以粘贴你的'rake routes'输出吗?另外,你可以尝试让路由去到显示页面,就像这个'<%​​= link_to post_path(post.id)%>'。你试过把@post = Post.find_by(id:params [:post_id]); contenders_controller#index'中的@contenders = @ post.contenders'代码? –

回答

0

如果你想有一个嵌套的URL,那么你需要在你的路由文件的东西,看起来像这样:

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

,然后在posts_controller你希望你的show方法能成为指数为contenders为特定post,对不对?

所以,在表演方法,你必须控制器找到了: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以获取应用程序绘制的路线的输出。第一列是您可以为路线调用的名称列表。在第三栏中,您将看到带有任何动态部分(如:id:post_id)的url,这些信息告诉您需要将该信息传递给路由。

所以,如果你有一个像/posts/:post_id/contenders一个网址,这将是你的索引行动,你将需要有一个link_to,看起来像这样:

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

然后,在你的竞争者表现出你愿意页有这样的事情(使用上述@contenders变量):

# views/contenders/show.html.erb 
... 
<% @contenders.each do |contender| %> 
    ... 
    <%= contender.name %> <!-- Or some other attribute that contender has... --> 
    ... 
<% end %> 
... 

让我知道这原来!

编辑:

看来你渲染contenders#index而不是在post#show。如果你想这样做,那么你可以将竞争者的索引行为限定在帖子中。像这样:

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

谢谢你回复詹姆斯,但不幸的是它仍然不适合我。 所以,基本上,我想在我的主页中放置所有帖子。当我点击一篇文章时,我想进入与帖子相关的竞争者页面。 因此,例如: 主页:邮政A,B,C,d等 如果我点击后B,我心底去一个页面,只显示后B. 我相关的竞争者也有问题了解显示和索引方法之间的区别。 (我没有任何显示方法)。 谢谢! – Benjamin

+0

顺便说一下,你用“link_to'Post'”,我想知道它是否只是一个错字,因为我认为它应该是link_to'竞争者'。 – Benjamin

+0

首先,“show”页面显示的只是一个对象以及任何想要显示该对象的信息。在这种情况下,我们希望显示一个帖子,并且该帖子将与其相关联的众多竞争者。这就是为什么在'def show ....'方法中,在posts_controller中,我们将范围限制为'@ post'。然后我们用@ post.contenders调用与帖子相关的所有竞争者。 –