0

新しいRails 4アプリのために、古いRuby on Rails 3アプリからいくつかのコードを借りてきました。コードは古いサイトでは機能しますが、新しいサイトでは機能しません。

ここに私のroutes.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

ただし、現在のユーザーのユーザー名はtestnil ではなく、エラーが表示されないように設定されています。

助けてくれてありがとう!

4

2 に答える 2

1

nil になる可能性のある変数がある場合、これらの状況で失敗することを明示的に望まない限り、それらが nil の場合を処理する必要があります。

レコードが見つからない場合、動的 find_by メソッドは nil を返します。したがって、alfonso が指摘したように、@user の null 値を取得しています。

この特定の例では、ユーザー名パラメーターをどのように使用しているかを質問します。レシピがレシピに関連付けられている場合は、ユーザー モデルに 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]

ここでは、params で検索しようとしています。

リンクは次のようになります 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 に答える