控制器和视图中的 NameError 仅显示 html

NameError in Controller and View is only displaying html

我昨天花了几个小时试图解决这个问题,休息后仍然让我感到沮丧,所以我想我会问。另外,如果这个 post 很长并且我对术语的使用是业余的,那么抱歉。我对编程还是很陌生。

我正在尝试使用 'themoviedb' gem 制作一个 rails 应用程序,它将允许用户搜索电影数据库的 api。这是 gem 的创建者提供的示例项目,它使用 rails 的旧版本:https://github.com/ahmetabdi/themoviedb-example。我试图在开始进行自己的更改之前重新创建此示例应用程序,但我 运行 遇到了 MoviesController 的麻烦。

这里是 MoviesController 的例子:

 class MoviesController < ApplicationController
      def show
        @movie = Tmdb::Movie.detail(params[:id])
        @images = Tmdb::Movie.images(params[:id])
        @cast = Tmdb::Movie.casts(params[:id])
        @trailers = Tmdb::Movie.trailers(params[:id])
        @similar_movies = Tmdb::Movie.similar_movies(params[:id])
      end
    end

这里是 Movies#Show View 示例的一部分:

<h3>Poster</h3>
 <%= image_tag("#{@configuration.base_url}w154#{@movie.poster_path}") if @movie.poster_path %>
<h3>Facts</h3>
  Budget: $<%= number_with_delimiter(@movie.budget, :delimiter => ',') %><br />
  Revenue: $<%= number_with_delimiter(@movie.revenue, :delimiter => ',') %><br />
  Status: <%= @movie.status %><br />
  Runtime: <%= @movie.runtime %><br />

如果我尝试使用此示例代码 运行 我的应用程序,则会出现此错误:

NoMethodError in Movies#show
undefined method `poster_path' for #<Hash:0x007fb615913de0>
app/views/movies/show.html.erb:5:in `_app_views_movies_show_html_erb___4006517199107153671_70210007215400'

我的解决方案是向 MoviesController 添加一个辅助方法并重构 Movies#Show View 的代码以修复哈希元素错误:

class MoviesController < ApplicationController
  helper_method :movie

  def show
    @movie = Tmdb::Movie.detail(params[:id])
    @images = Tmdb::Movie.images(params[:id])
    @cast = Tmdb::Movie.casts(params[:id])
    @trailers = Tmdb::Movie.trailers(params[:id])
    @similar_movies = Tmdb::Movie.similar_movies(params[:id])
  end

  private 
    def movie
        @movie = Tmdb::Movie.detail(params[:id])
        images = Tmdb::Movie.images(params[:id])
    end
end

#views/movies/show.html.erb
  <h3>Poster</h3>
  <%= image_tag("#{@configuration.base_url}w154#{movie[:poster_path]}") if movie[:poster_path] %>
  <h3>Test data</h3>
  Runtime: <%= movie[:runtime] %><br />

通过进行这些更改,我可以使用正确的 ID 加载页面,但是 rails 命令中的 none 似乎 运行,所以我最终得到了显示 html 的页面,但显示拉取信息的 none。

以下是我尝试调出电影时终端中显示的内容:

Started GET "/movies/329" for 127.0.0.1 at 2015-04-19 14:32:07 -0700
Processing by MoviesController#show as HTML
  Parameters: {"id"=>"329"}
  Rendered movies/show.html.erb within layouts/application (900.5ms)
  Rendered layouts/_header.html.erb (0.8ms)
  Rendered layouts/_footer.html.erb (0.2ms)
Completed 200 OK in 2083ms (Views: 1011.1ms | ActiveRecord: 0.0ms)

我认为我只是遇到了某种语法问题,但我真的不知道。我想我也可能想得太多了。我的 SearchController 和视图工作正常,但我无法通过此 controller/view 获得结果。

我非常感谢能帮助我解决这个问题的任何帮助或建议。

在第一种情况下,当您在视图中看到以下行时:

@movie.poster_path

你得到了 NoMethodError 因为 @movie 是由 Tmdb::Movie.detail(params[:id]) 返回的哈希,而 Hash 对象没有 poster_path 方法。访问它的正确方法只是 @movie[:poster_path],正如您在第二次尝试中所写的那样。

但是,您的第二次尝试无效,因为 movie@movie 不同。当您使用在视图 movie 中创建的辅助方法时,您并没有访问 @movie 哈希。正如它的定义,它 returns 最后一行执行的结果,在你的情况下是

images = Tmdb::Movie.images(params[:id])

这就是 movie 的值,由于它没有 :poster_path 键,因此不会显示任何内容。

我相信您可以通过删除辅助方法并在您的视图中使用 @movie["poster_path"] 来实现此目的。不过,我之前没有使用过 themoviedb gem,但我认为这是可行的方法。

已更新

看起来 Tmdb::Movie.detail(id) 返回的散列将字符串作为键而不是符号,它不是 HashWithIndifferentAccess。应使用 @movie["poster_path"] 而不是 @movie[:poster_path].

访问元素