【问题标题】:controller doesn't receive id param控制器没有收到 id 参数
【发布时间】:2026-02-10 06:30:01
【问题描述】:

我正在尝试显示一个页面,显示喜欢微博的用户。我希望 Uri 是 localhost:3000/microposts/someid#/into_it。好像通过路径没有响应控制器?

我在 view/microposts/_micropost.html.erb 文件中链接到此页面:

<%= link_to micropost.votes_for, into_it_micropost_path(@micropost) %>

由于此路径,我在浏览器中收到以下错误并且页面无法加载:

No route matches {:action=>"into_it", :controller=>"microposts", :id=>nil}

在我的微博控制器中:

def into_it  #for the view; displays who likes the post
  @title = "Into_it!"
  @micropost = Micropost.find(params[:id])
  render 'show_users_into_it'
end

micropost/show_users_into_it 目前是一个空白文件

路线文件:

resources :microposts, only: [:create, :destroy, :into_it] do
  member do
    get :into_it
  end
end

在我的 rake 路线中:

into_it_micropost GET    /microposts/:id/into_it(.:format)     microposts#into_it

【问题讨论】:

    标签: ruby-on-rails controller routes


    【解决方案1】:

    由于@micropost 无效而发生此错误。 @micropost 应该是来自数据库的对象。它应该有一个ID。在您的错误消息中,您可以看到 micropost 的 id 为 nil(我猜 @micropost 是新记录)。

    :id=>#<Micropost id: nil
    

    如果你通过现有的@micropost 一切都会好起来的。

    【讨论】:

    • 不,他是说,如果@micropost 是新记录,您应该隐藏此链接
    • 这不是新记录。我只想找到喜欢现有微博记录的用户并显示用户
    • 如果不是新记录,为什么id是nil?不可能这样。检查@micropost。您可以致电@micropost.new_record?查看。评论链接并检查@micropost
    【解决方案2】:

    真的只是一个愚蠢的错误。路线没有得到 id 参数。我要做的只是改变:

    into_it_micropost_path(@micropost)
    

    into_it_micropost_path(micropost.id)
    

    以便它从数据库中的现有记录中获取 id

    【讨论】: