-1

この問題をどこから始めればよいかわかりません。ネストされたルートを持つ画像があります。例:

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

最初の画像 (id = 3) に入ると、機能します。しかし、2 番目のイメージ (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

編集:OK、モデルクラスのメソッドでメソッドを作成することで、それから抜け出すことができます:

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 になり、代わりにコレクションの最初の画像が返されます。コレクションに画像が 1 つしかない場合を除き、リンクはアクティブになります最初はコレクションが空でない限りアクティブにすることを考えていましたが、空にすることはできないと思います。 .

于 2013-07-25T15:41:56.313 に答える
1

あなたの id はnullとしてリストされています。これは、表示ビューに移動する前に、ImageControllerの表示アクションで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 に答える