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
方法能够成为特定 post
的 contenders
的索引,对吧?
因此,在 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
我需要一些帮助。
我有属于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
方法能够成为特定 post
的 contenders
的索引,对吧?
因此,在 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