如何在 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()
我是 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()