【问题标题】:Using a named scope使用命名范围
【发布时间】:2011-05-23 00:11:12
【问题描述】:

我正在尝试使用命名范围来设置我的用户运营商,但不断收到此错误

#<:relation:0x5ee3e40> 的未定义方法“目标”

app/models/user.rb:19:in `set_carrier'
app/controllers/users_controller.rb:49:in `block in create' app/controllers/users_controller.rb:48:in `create'

<div class= "field">
  <%= f.label :carrier %><br>
  <%= f.collection_select(:carrier_name, Carrier.find(:all) ,:name, :name) %>
</div>

用户.rb

class User < ActiveRecord::Base

  acts_as_authentic
  after_create :set_sub
  after_create :set_universal
  after_create :set_carrier

  def set_sub
    #self.roles << "subscriber"
    self.roles_mask = 4
  end

  def set_universal
      self.channels << Channel.find(1)
  end

  def set_carrier
    @carrier = Carrier.with_name(self.carrier_name)
    self.carrier<< @carrier
  end

  ROLES = %w[admin  moderator subscriber]

  #Each user can subscribe to many channels
  has_and_belongs_to_many :channels

  #Each user who is a moderator can moderate many channels
  #has_many :channel_mods
  has_and_belongs_to_many :modifies , :class_name => "Channel"

  #Each user can receive many messages
  has_and_belongs_to_many :messages

  #Each user belongs to a carrier
  belongs_to :carrier

  #Filter users by role(s)
  named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0 "} }

  def roles  
    ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }  
  end

  def roles=(roles)  
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum  
  end

  def role_symbols
  roles.map do |role|
    role.underscore.to_sym  # NOT role.name.underscore.to_sym (role is a string)
    end
  end


end

运营商.rb

class Carrier < ActiveRecord::Base
  has_many :users

  named_scope :with_name, lambda {|name| {:conditions => {:name => name}}}


end

用户控制器

class UsersController < ApplicationController

   filter_resource_access

  # GET /users
  # GET /users.xml
  def index
    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users }
    end
  end

  # GET /users/1
  # GET /users/1.xml
  def show
    #@user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @user }
    end
  end

  # GET /users/new
  # GET /users/new.xml
  def new
    #@user = User.new
    @carriers = Carrier.find(:all)

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @user }
    end
  end

  # GET /users/1/edit
  def edit
    #@user = User.find(params[:id])
  end

  def create
    #@user = User.new(params[:user])
    #@user.channels << Channel.find(1)

    respond_to do |format|
      if @user.save
        format.html { redirect_to(:channels, :notice => 'Registration successfully.') }
        format.xml { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "new" }
        format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

  def profile
    @user = User.find(params[:id])
  end



  # PUT /users/1
  # PUT /users/1.xml
  def update
  #@user = current_user

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to(@user, :notice => 'User was successfully updated.') }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.xml
  def destroy
    @user = User.find(params[:id])
    @user.destroy
    respond_to do |format|
      format.html { redirect_to(users_url) }
      format.xml  { head :ok }
    end
  end

  def delete
    @user = User.find(params[:user_id])
    @user.destroy
    redirect_to :users
  end

end

【问题讨论】:

    标签: ruby-on-rails activerecord authlogic


    【解决方案1】:

    您可能正在使用数组而不是单个项目。 belongs_to 关系要么为 nil,要么为模型。

    您可能打算直接分配:

    def set_carrier
      self.carrier = Carrier.with_name(self.carrier_name).first
    end
    

    &lt;&lt; 运算符用于将项目附加到数组,但carrier 不是数组。这可能会在 Rails 中引发更深层次的问题。

    【讨论】:

    • 感谢它的工作!你会知道用户模型中的 set_sub 定义有什么问题吗?
    • 您可能打算使用self.roles_mask |= 4self.roles += %w[ subscriber ]
    【解决方案2】:

    以防万一这对任何人都有帮助:我也收到了这样的错误消息:

    def Foo
       has_many :bars
       has_many :thingies, through: :bars
    end
    

    然后我在控制器中执行此操作;

    Foo.all.includes(:bars, :thingies)
    

    它在试图通过范围时爆炸了。修复方法是从包含调用中删除“bars”——它们将自动预先加载,因为“thingies”正在被预先加载。

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多