-1

我不确定从哪里开始解决这个问题。我有嵌套路线的图像,例如:

localhost:3000/users/1/images/3
localhost:3000/users/1/images/4

当我进入第一张图片(id = 3)时,它可以工作。但是当我转到第二张图片(id = 4)时,出现路由错误

No route matches {:action=>"show", :controller=>"images", :user_id=>1, :id=>nil}

我也有其他图片(来自以前的上传),现在当我上传其他图片时,我的 id 得到 nil。

当我检查我的数据库时,它显示数据在那里,并且它确实有正确的行,id 为 4。

这发生在任何人身上吗?rake我可以使用某种命令吗?这很困惑,我什至不知道从哪里开始显示我的代码以查看错误来自哪里

编辑:

user_image GET    /users/:user_id/images/:id(.:format)         images#show

路线.rb:

App::Application.routes.draw do
  resources :users do
    resources :images do
      resources :comments, :defaults => { :commentable => 'image' }
    end
  end
end

编辑:

我发现了这个问题.. 显然这是我的 show.html.erb 视图中的一条路径,我试图从我的数据库中获取“下一个”图像并且没有 id 可以获取

<%= link_to "Next", user_style_path(@image.user_id, @image.next_img) if user_style_path(@image.user_id, @image.next_img) %>

在我的模型中,我有:

  def previous_img
    self.class.first(:conditions => ["created_at < ?", created_at], :order => "created_at desc")
  end

  def next_img
    self.class.first(:conditions => ["created_at > ?", created_at], :order => "created_at asc")
  end

如何退回到仅与用户关联的图像,以便它只会回收图像?

4

2 回答 2

1

您的 id 被列为null,这向我表明您可能没有首先在 ImageController 的show操作中识别您的 Image 对象,然后再转到您的显示视图。

@image = @user.images.find(params[:id])

在您的显示控制器操作中,看看会发生什么。如果尚未定义,@user 应该是

@user = User.find(params[:user_id])

如果这不起作用,则可能是路由问题。确保您的 config/routes.rb 中有正确的嵌套资源:

resources :users do
  resources :images
end

否则,请检查您的关联:您的 User 类应该与图像具有has_many关系,并且您的 Image 类应该与用户具有belongs_to关系。

于 2013-07-25T06:43:58.240 回答
1

编辑:好的,您可以通过在模型类方法上创建方法来摆脱这种情况:

def self._next(img)
  first(:conditions => ["created_at > ?", img.created_at], :order => "created_at asc") || first
end

然后将它们限定为视图中的用户:

<%= link_to "Next", user_style_path(@image.user_id, @user.images._next(@image)) unless @user.images == [@image] %>

Rails 将为您组合范围。请注意,我假设您有 @user 或 current_user 或可用的东西,并且类方法是 #_next 而不是 #next,因为“next”是保留关键字。

#_next 的结构方式,如果它实际上无法找到下一个图像(第一个创建的比当前更新的图像),则该子句将为 nil,并且它将返回集合的第一个图像。除非集合中只有一张图片,否则链接将处于活动状态.

于 2013-07-25T15:41:56.313 回答