[Rails 3]无法在后置控制器外调用后置控制器的自定义方法

时间:2010-11-21 06:28:28

标签: ruby-on-rails ruby-on-rails-3 methods

我在PostsController中定义了一个自定义方法,如下所示: -

class PostsController < ApplicationController
 ...<<other methods truncated from display >>
  public
    def update_bid_winner (winner_id)
    @post.bid_winner_id = winner_id
    @post.save
  end  
end  

但是当我尝试从其他控制器(在我的情况下为BidsController)中调用它时。如果投标是帖子的必要资源: -

resources :posts do
  resources :bids do
    member do
      get 'offer_bid'
    end
  end
 end  

我尝试从出价控制器调用我的自定义方法: -

 def offer_bid
   @post = Post.find(params[:post_id])
   @bid = Bid.find(params[:id])
   @post.update_bid_winner(@bid.user_id)  <<<<<<<<<< Here goes the call
   @post.save
    redirect_to post_path(@post)
end

但是我得到一个错误,说未定义的方法update_bid_winner: -

undefined method `update_bid_winner' for #<Post:0xb68114f4>  

帮帮我。我在这做错什么吗?如果是这样,请建议实现相同的方法!!

先谢谢。

3 个答案:

答案 0 :(得分:2)

这不起作用,因为您在Post对象上调用该方法,但您已在PostsController类中定义了该方法。必须在Post模型文件(app / models / post.rb)中定义此方法才能使其按您的需要工作。

通常,更新对象的方法应该放在该对象的相应类中。

答案 1 :(得分:1)

PostsController和Post是两个不同的类。注意@post是一个Post对象:@post = Post.find(params[:post_id])

app/models/post.rb而不是app/controllers/posts_controller.rb中定义方法。

答案 2 :(得分:0)

实际上,实现我的任务的最佳方法是在控制器本身使用以下行: -

@post.update_attribute(:bid_winner_id,@bid.user_id)  

模型中不需要任何新方法来更新属性 但作为其他答案提供的输入真的有助于启发我:)。感谢。