代码之家  ›  专栏  ›  技术社区  ›  Hemanth

[Rails3]无法在post控制器外部调用post控制器的自定义方法

  •  0
  • Hemanth  · 技术社区  · 15 年前

    我在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)。如果Bid是post的嵌套资源:-

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

    我试图从bids控制器调用自定义方法,如下所示:-

     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 回复  |  直到 15 年前
        1
  •  1
  •   Josiah Kiehl    15 年前

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

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

        2
  •  2
  •   Ryan Bigg Andrés Bonilla    15 年前

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

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

        3
  •  0
  •   Hemanth    15 年前

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

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

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