控制器和视图中的 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]
.
访问元素
我昨天花了几个小时试图解决这个问题,休息后仍然让我感到沮丧,所以我想我会问。另外,如果这个 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]
.