0

在我的提要中,我有这个:

<span class="title"><strong><%= link_to feed_item.title, @micropost %></strong></span><br>

我不知道如何使它链接到帖子的各个页面。

现在它链接到:http://localhost:3000/microposts我收到一个错误:没有路由匹配 [GET] "/microposts"

如果我手动输入 URL:http://localhost:3000/microposts/25我可以看到帖子的个人页面。

这可以链接到用户个人资料,但我无法让链接到微博页面。<%= 链接到 feed_item.user.name, feed_item.user %>

我是 Rails 新手,我正在努力解决这个问题。任何帮助,将不胜感激。

microposts_controller.rb

class MicropostsController < ApplicationController
  before_filter :signed_in_user, only: [:create, :destroy]
  before_filter :correct_user,   only: :destroy

  def index
  end

  def show
    @micropost = Micropost.find(params[:id])
  end

  def create
    @micropost = current_user.microposts.build(params[:micropost])
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end

  def destroy
    @micropost.destroy
    redirect_to root_url
  end

  private

  def correct_user
    @micropost = current_user.microposts.find_by_id(params[:id])
    redirect_to root_url if @micropost.nil?
  end
end

配置/路由.rb

SampleApp::Application.routes.draw do
  resources :users do
    member do
      get :following, :followers
    end
  end
  resources :sessions, only: [:new, :create, :destroy]
  resources :microposts, only: [:create, :destroy, :show]
  resources :relationships, only: [:create, :destroy]

  root to: 'static_pages#home'

  match '/signup',  to: 'users#new'
  match '/signin',  to: 'sessions#new'
  match '/signout', to: 'sessions#destroy', via: :delete

  match '/help',    to: 'static_pages#help'
  match '/about',   to: 'static_pages#about'
  match '/contact', to: 'static_pages#contact'
end

_feed_item.html.erb

<li id="<%= feed_item.id %>">
  <%= link_to gravatar_for(feed_item.user), feed_item.user %>
  <span class="title"><strong><%= link_to feed_item.title, micropost_path(@micropost) %></strong></span><br>
    <span class="user">
      <p><small>Created by: <%= link_to feed_item.user.name, feed_item.user %><br>
        <%= feed_item.loc1T %><br>
         <%= feed_item.startTime.strftime('%A, %B %d, %Y') %></small></p>
    </span>
    <span class="content"><%= feed_item.content %></span>
    <span class="timestamp">
      Posted <%= time_ago_in_words(feed_item.created_at) %> ago.
    </span>
  <% if current_user?(feed_item.user) %>
    <%= link_to "delete", feed_item, method: :delete,
                                     data: { confirm: "Are you sure?" },
                                     title: feed_item.content %>
  <% end %>
</li>

feed.html.erb

<% if @feed_items.any? %>
  <ol class="microposts">
    <%= render partial: 'shared/feed_item', collection: @feed_items %>
  </ol>
  <%= will_paginate @feed_items %>
<% end %>`

静态页面控制器

class StaticPagesController < ApplicationController
  def home
    if signed_in?
      @micropost  = current_user.microposts.build
      @feed_items = current_user.feed.paginate(page: params[:page])
    end
  end

  def help
  end

  def about
  end

  def contact
  end
end
4

1 回答 1

3

长答案

当您将路由添加到您的 routes.rb 文件时,Rails 会为您生成许多方便的命名路由。通常,当对路线有疑问时,我会查看我的 rake routes 任务,它会显示所有可用路线的列表。尝试运行rake routes > routes.txt并打开相应的 routes.txt 文件。

生成的文件将为您列出一系列请求,在您的情况下,您的 microposts 控制器应该会看到与此类似的内容:

          POST      /microposts(.:format)                microposts#create
micropost GET       /microposts/:id(.:format)            microposts#show
          DELETE    /microposts/:id(.:format)            microposts#destroy

Rake 路线为您的每条路线生成以下信息(如果适用):

  1. 路线名称(如果有)
  2. 使用的 HTTP 动词(如果路由没有响应所有动词)
  3. 要匹配的 URL 模式
  4. 路由的路由参数

考虑到这些信息,我们可以简单地查看 routes.txt 文件中提供的 url,以获取我们试图访问的 url (/microposts/25)。您会看到列出的/microposts/:id(.:format)url 模式完美地处理了这一点。瞧,它还映射到您想要的 microposts#show 操作,所以现在要获得命名路线,只需查看要出现的第一列,您就会看到“microposts”关键字。只需在其中添加 _path ,您就可以在视图中使用命名路由来生成链接 url。由于此特定路由需要一个 id 参数(如 url 模式中所述),因此您还必须传递命名的路由助手和 id 参数。

同样在您的 routes.rb 文件中,当您添加resources :something它时,它会为默认的七个 RESTful 路由(新建、创建、编辑、更新、删除、索引、显示)中的每一个生成路由。在您的情况下,您明确告诉 rails 为创建、销毁和显示操作生成默认路由,以便您可以擦除底部的行, match "/microposts/:id" => "microposts#show"因为这已经被处理了。


简短的回答

改变这个:

<%= link_to feed_item.title, @micropost %>

对此:

<%= link_to feed_item.title, micropost_path(feed_item) %>

请参阅Ruby on Rails 指南:从外到内的 Rails 路由,了解有关路由的所有信息。

于 2012-10-15T22:03:37.383 回答