如何在 Rails 中使用从模型到控制器的调用方法

How to use call method from Model to controller in Rails

我是 rails 的新手,目前正在处理我拥有多个模型的个人项目的功能。我有这些模型 - 地点、收藏夹、ThingsToDo、用户。

用户、ThingsToDo 和收藏夹具有 many-many 关系,其中收藏夹是一个连接 table。 /places (PlacesController) 现在渲染所有的地方。我正在尝试呈现在所有 things_to_do 中拥有最多收藏夹的城市应该首先显示,然后是用户帐户中未添加为收藏夹的下一个地方。

注意(地点和 things_to_do 有 has_many 关联)。

最喜欢的模型 - group_by_favorite(方法名称)

class Favorite < ApplicationRecord
  belongs_to :user
  belongs_to :things_to_do
end

#validates :things_to_do_id, uniqueness: { scope: :user_id, :message => "has already been added as favorite" }

def group_by_favorite
  Favorite.joins(:things_to_do,:user).group(:place_id).count
end 

放置模型

    has_many :things_to_dos
end

def self.top_places
 @places_render = group_by_favorite.sort
end

放置控制器

class PlacesController < ApplicationController

    def index
        @places_render = top_places()
        places = Place.all 
        render json: places
    end

当我尝试 运行 /places 路线时,出现此错误

"#<NoMethodError: undefined method `top_places' for #<PlacesController:0x00000000011aa8>>",

我对 /places 的 React 代码

export default function DestinationContainer({user}){

    const[allDestination,setAllDestination]= useState([])
    const [search, setSearch] = useState("");
   
    
    useEffect(()=> {
        fetch("/places")
        .then((res) => res.json())
        .then((data) => {
          
            setAllDestination(data)
        })
    },[])

    

    const filterPlaces = allDestination.filter(
        (destinations) =>
        destinations.city.toLowerCase().includes(search.toLowerCase()) )


    return (
        <> 
            <Switch> 
             <Route exact path= "/places">
                <SearchPlace search={search} setSearch={setSearch}/>
                <DestinationView allDestination= {filterPlaces} user = {user} />
             </Route>
             <Route path="/places/:destinations" >
                <ThingsToDoRender user ={user} /> 
             </Route>
             </Switch> 
        </>
    )
}

有什么方法可以修复这个错误吗?我也尝试过使用范围,但不确定它是否适用于这种情况。

如您的错误所述,方法 top_places() 未在您的 PlacesController class 中定义。但它是一个 Place class 函数。所以请尝试以下操作:

@places_render = Place.top_places()