0

Rails 2.2.2 から Rails 3 へのサイトの移行

クエリを実行して変数 @user に格納していますが、@user のメンバーにアクセスしようとすると、@user がハイドレートされ、「is_admin」の値を持っていてもエラーが発生します。

### @user.inspect returns
[#<B2bUser id: 398, name: "Tim Test", email: "tim_test@test.com", username: "timtest", password: "foo", is_admin: true, company: "Test Co.", sent_welcome_email: true, created_at: "2011-12-14 08:32:31", send_email_reminders: false, api_username: "api.tim_test@test.com", api_password: "FOOBAR", login_attempts: nil, last_login_attempt_at: nil>]

しかし、私がこれをそのビューから呼び出すと:

<% if (@user.is_admin) %> 

私はこれを得る:

Completed 500 Internal Server Error in 15ms

ActionView::Template::Error (undefined method `is_admin' for #<ActiveRecord::Relation:0xaa5db4c>):
    14:
    15:         <%= render :partial => "/warning" %>
    16:
    17:         <% if (@user.is_admin) %>
    18:
    19:                
    20:

同じビューで、次のように複数の行が返されると、同じタイプのエラー (未定義のメソッド p.vendor_name) が発生します。

<% for p in @privileges %>

        <% next if !p.can_setup_purchase_orders and !p.can_setup_instant_electronic_delivery %>

        <h2>For <%= p.vendor_name %></h2>

これが私のコントローラーです

class HomeController < ApplicationController

 before_filter :authenticate

  def index
    @nav = []
    @user = B2bUser.where(:id => request.session[:user_id])
    #logger.debug @user.inspect
    @privileges = B2bPrivilege.lookup_all request.session[:user_id]
    #logger.debug @privileges.inspect

    @can_asn = false
    @can_push_xml = false

    for p in @privileges
      if p.can_setup_advance_ship_notification?
            @can_asn = true and break
        end
         if p.can_setup_xml_pushes?
                @can_push_xml = true and break
            end


    end

  end

end

これが私のメソッド lookup_all class B2bPrivilege < ActiveRecord::Base です

  def B2bPrivilege.lookup_all current_user_id

    #return B2bPrivilege.find(:all, :conditions => "b2b_user_id = #{current_user_id}", :joins => "LEFT JOIN vendors ON vendors.id = b2b_privileges.vendor_id", :select => "b2b_privileges.*, vendors.name AS vendor_name")
    return B2bPrivilege.joins('LEFT JOIN  vendors ON vendors.id = b2b_privileges.vendor_id').where('b2b_user_id' => current_user_id)
    #return B2bPrivilege.find_by_sql["SELECT b2b_privileges.*, vendors.name AS vendor_name FROM b2b_privileges LEFT JOIN vendors ON vendors.id = b2b_privileges.vendor_id WHERE b2b_user_id = ?", current_user_id]
end

@user のメンバーに別の方法でアクセスする必要がありますか? これは、Rails 2.2.2/Ruby 1.8.7 で機能していました。

ありがとう

4

1 に答える 1

1

よく見ると、@user実際には User ではなく ActiveRecord::Relation オブジェクトであることがわかります。そのリストにユーザーが 1 人しかいない場合は、必要なフィールドに@user.first.is_admin.

ただし、@userコントローラーの最初の結果になるように設定する方が理にかなっています。

更新: レールでは、オブジェクトのような配列である関係を返します単一のモデル レコードは返されません。代わりに使用B2bUser.find(request.session[:user_id])して、単一のユーザー レコードを取得します。

于 2013-03-12T16:41:45.943 に答える