2

私は ROR を初めて使用し、stackoverflow と github のすべてのページを調べて問題を解決しようと懸命に努力しています。すべてのページを確認したことを約束しますが、それでも問題の解決策を見つけることができませんでした。皆さんが私を助けてくれることを願っています。

問題は、thumbs_up gem を実装した後、Brady の指示に従ったことです: Rails 3 で "thumbs_up" 投票 gem を使用する方法の明確化

しかし、私のビュー ページにはエラー メッセージが表示されます。

No route matches {:action=>"vote_up", :controller=>"posts", :id=>nil}

rake ルートを確認したところ、vote_up_post パスがそこにあるので、行ってみました。

http://0.0.0.0:3000/posts/vote_up and this shows up:

ActiveRecord::RecordNotFound in PostsController#show
Couldn't find Post with id=vote_up

これが私の見解です - index.html.erb

<%= link_to('vote for this post!', vote_up_post_path(@post), :method => :post) %>

posts_controller.rb

def vote_up
begin
current_user.vote_for(@post = Post.find(params[:id]))
render :nothing => true, :status => 200
rescue ActiveRecord::RecordInvalid
render :nothing => true, :status => 404
end
end

モデル - user.rb

# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me
# attr_accessible :title, :body

acts_as_voter

モデル - post.rb

attr_accessible :title, :source, :description, :imageurl, :link

validates :title, presence: true, uniqueness:true, length: { maximum: 70 }
validates :source, presence: true, length: { maximum: 20 }
validates :description, presence: true, length: { maximum: 240 }
validates :imageurl, presence: true
validates :link, presence: true

default_scope order: 'posts.created_at DESC'

acts_as_voteable

ルート.rb

devise_for :users

resources :posts do
member do
post :vote_up
end
end

devise_scope :user do
get "sign_in", :to => "devise/sessions#new"
get "sign_out", :to => "devise/sessions#destroy"
get "sign_up", :to => "devise/registrations#new"
end

resources :submissions

match '/submit', to: 'submissions#new'
match '/post', to: 'posts#new'

このようなばかげた質問をして申し訳ありませんが、皆さんからの助けを本当に感謝します.

4

2 に答える 2

0

発生するエラー

No route matches {:action=>"vote_up", :controller=>"posts", :id=>nil}

ラインから来る

<%= link_to('vote for this post!', vote_up_post_path(@post), :method => :post) %>

ルーターはIDがnilのルートを見つけようとします。ここでは、IDは「@post」です。最初に行うことは、@ post変数がどこにあるかを検索し、その変数がnilでないことを確認することです。link_toを削除し、単純な

<%= @post.inspect %>

ビューの上部にあると答えます:ページに「nil」と表示されている場合、@postはコントローラーで初期化されていません:)

于 2013-02-28T08:57:48.630 に答える
0

次のように変更routes.rbします。

resources :posts do
  collection do
    get :vote_up
  end
end

エラーCouldn't find Post with id=vote_upは、vote_up投稿コントローラーのメンバーではないことを示しています。

したがって、アクションをメンバーではなくコレクションvote_upとして作成すると、すべて問題ありません。

URLにアクセスすると、次のようになります。

http://0.0.0.0:3000/posts/vote_up 

これが表示されます:

vote_upIDとして扱われなくなります。

ActiveRecord::RecordNotFoundvote_upこれは、が posts モデルのメンバー ID として扱われるためです。また、投稿モデルvote_upID として検索しようとすると、ID になることはないため、レコードが見つかりません。

于 2013-02-28T09:02:11.223 に答える