0

我一直在从我的一个旧的 ruby​​ on rails 3 应用程序中借用一些代码来开发一个新的 rails 4 应用程序。该代码在旧站点上有效,但在新站点上无效。

这是我的路线.rb:

scope ':username' do
  resources :recipes
end
get "/:username" => "recipes#index"

这是我的控制器索引:

def index
   @user = User.find_by_username params[:username]
   @recipes = Recipe.all
end

和我的观点:

<% @recipes.each do |recipe| %>
  <tr>
    <td><%= recipe.name %></td>
    <td><%= link_to recipe.name, recipe_path(username: @user.username, id: recipe.id) %></td>
    <td><%= link_to 'Edit', edit_recipe_path(recipe) %></td>
    <td><%= link_to 'Destroy', recipe, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

但错误弹出:

undefined method `username' for nil:NilClass

但当前用户用户名设置为test所以它不是零,并且不应该弹出错误。

感谢大家的帮助!

4

2 回答 2

1

当您有可能为 nil 的变量时,您应该处理它们为 nil 的情况,除非您明确希望它在这些情况下失败。

当没有找到记录时,动态 find_by 方法返回 nil。因此,正如阿方索所指出的,您将获得 @user 的空值。

在这种特殊情况下,我会质疑您如何使用用户名参数;如果食谱与食谱相关联,那么我将在我的用户模型中设置 has_many :recipes ,并在我的食谱模型中设置 belongs_to :user 。

由于用户在这里是“父母”,我会选择在 UsersController 中创建一个食谱操作。对我来说,将属于用户的食谱放在用户的控制器中,并将食谱作为用户的集合访问似乎更合乎逻辑。

或者,如果您尝试显示与用户关联的食谱,我会将操作放在 RecipesController 中,并使用从数据库中的 belongs_to 关系设置的#user 方法获取属于食谱的用户。

无论哪种情况,您都需要确保在尝试呈现页面之前定义了用户和/或任何配方。如果尝试访问的用户不存在等,您可能希望显示 501 错误或类似内容。

如果您坚持应该始终有一个配方的用户,那么您应该将该类型的验证添加到配方模型中,这样就不允许添加没有用户的配方:

validates :user, :presence => true

对不起,如果我有点偏离了切线。

于 2013-07-08T23:39:09.350 回答
0
get "/:username"

这里 -:username在 id 的位置

@user = User.find_by_username params[:username]

在这里,您试图通过参数找到它。

链接应该是这样的 http://localhost:3000/user_name/user_name?username=user_name

找到一些用户,这显然不是你想要实现的。

get "/:id" => "recipes#index"

 @user = User.find(params[:id])
于 2013-07-09T00:01:48.903 回答