Rails, 页面链接

Rails, linking of pages

我需要一些帮助。

我有属于post的«竞争者»。 (每个 post 都有不同的竞争者)。

我希望在点击某个post时能够显示竞争者。

我不知道如何 link/route 这个。我希望将 «posts » 作为我的索引页,并能够点击任何 post 并获得相应的竞争者。 我在竞争者中添加了一个 post_id 作为参考。但我什至不知道这样做是否正确。

感谢您的帮助!!

PS:我不知道这是否会改变什么,但我正在尝试使用 ActiveAdmin 作为后端和 Carrierwave 来上传图像。

posts/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>

contenders/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

controllers/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

controllers/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 日开始为 127.0.0.1 获取“/posts/10/contenders”20:22:16 +0000 由 ContendersController#index 处理为 HTML 参数:{"post_id"=>"10"} 在 layouts/application 内呈现 contenders/index.html.erb 竞争者负载(0.5 毫秒)
SELECT "contenders".* 来自 "contenders" 在 layouts/application(2.8 毫秒)内呈现 contenders/index.html.erb 在 177 毫秒内完成 200 OK(视图:172.9 毫秒 | ActiveRecord:0.5 毫秒)

在 2017 年 1 月 16 日开始获取 127.0.0.1 的“/”20:35:30+0000 由 PostsController#index 处理为 HTML 在 layouts/application 内渲染 posts/index.html.erb Post 负载(1.0 毫秒)
SELECT "posts".* 来自 "posts" 在 layouts/application(25.3 毫秒)内呈现 posts/index.html.erb 在 322 毫秒内完成 200 OK(视图:310.8 毫秒 | ActiveRecord:1.0 毫秒)


所以我编辑了代码。而且它仍然没有显示正确的东西。

posts/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>

contenders/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>

controllers/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

controllers/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

如果你想要一个嵌套的 url,那么你需要在你的路由文件中添加如下内容:

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

然后在您的 posts_controller 中,您希望您的 show 方法能够成为特定 postcontenders 的索引,对吧?

因此,在 show 方法中,您会让控制器找到 post 和 :post_id,然后列出 post 的竞争者,如下所示:

# 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 来获取您的应用程序绘制的路线的输出。第一列是您可以为路由调用的名称列表。在第三列中,您会看到 url 以及任何动态部分,如 :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。如果您想这样做,那么您可以将竞争者的索引操作范围限定为 post。像这样:

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