【问题标题】:Passing a model object to a link generated by a named route将模型对象传递给由命名路由生成的链接
【发布时间】:2016-06-08 07:19:33
【问题描述】:

在我的 routes.rb 文件中,我有:

get 'search' => 'movies#search', as: :search_directors

movies 控制器中的 search 操作如下所示:

def search
  @movie = Movie.find(params[:id])
  # other code
end

其中一个视图包含以下链接:

= link_to 'Find Movies With Same Director', search_directors_path(@movie)

我希望当点击此链接时,@movie 对象的 ID 可通过 params[:id]movies#search 操作中。但是,当我点击它时,Rails 给了我这个错误:

ActiveRecord::RecordNotFound in MoviesController#search

找不到带有 'id'= 的电影

我作为参数传递给路由的 @movie 对象是有效的,因为视图的其他部分工作正常(它是 show.html电影 URI 的 .haml 视图)。

【问题讨论】:

    标签: ruby-on-rails routes


    【解决方案1】:

    您需要在路由中指定 id,或将其作为附加参数传递(在这种情况下,它将作为 GET 参数附加到 url)。

    get 'search/:id' => 'movies#search', as: :search_directors
    

    或者(对于 GET 参数):

    = link_to 'Find Movies With Same Director', search_directors_path(id: @movie.id)
    

    在最后一种情况下,您必须在搜索方法中添加一个条件来测试 params[:id] 是否存在。

    【讨论】:

      【解决方案2】:

      希望这对你有用...

      def search
        @movie = Movie.find(params[:id]) # this will raise ActiveRecord::RecordNotFound if id is not available in data base.
      
        # you should use where instead of find
        @movie = Movie.where(id: params[:id]).first # this will return nil if not found but not raise ActiveRecord::RecordNotFound Exceptaion.
        # other code
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-15
        • 2011-04-17
        • 2023-04-03
        • 2023-03-31
        • 2022-12-17
        • 2023-03-12
        • 2019-12-07
        • 1970-01-01
        相关资源
        最近更新 更多