2

请我一直在做这个项目,我需要将一些旅馆属性分配给具有角色的特定用户。我使用 devise、rolify 和 cancan 创建了一个宿舍模型和一个用户模型。我还创建了一个分配模型,其属性为旅馆 ID 和用户 ID。以下是我的代码以便更好地检查。

我的宿舍模型

class Hostel < ActiveRecord::Base

  has_many :assign_hostels

  attr_accessible :name, :location, :picture
  default_scope :order => 'id DESC'
end

用户模型

class User < ActiveRecord::Base
  has_many :assign_hostels

  attr_accessible :email, :password, :first_name, :lastname, :oname
  rolify
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

end

我的 assign_hostel 模型

class AssignHostel < ActiveRecord::Base
  belongs_to :user
  belongs_to :hostel
  attr_accessible :user_id, :room_id
  validate :user_id, :uniqueness => true
end

在我的宿舍页面中,在我创建了宿舍列表之后。我创建了一个分配宿舍按钮,它将打开一个新的分配页面以列出所有具有搬运工角色的用户

<%= link_to 'Assign', accommodation_new_assign_hostel_path(:id => hostel.id) %>

控制器中的新分配

def new_assign_hostel
  @search = Search.new(:user, params[:search], :per_page => 2)
  @search.order = 'email'
  @users = @search.run
  @hostel = Hostel.find(params[:id])
  @porters = Role.find_by_name('porter').users
  @assign_hostel = AssignHostel.new(:hostel_id => params[:hostel_id])
  respond_to do |format|
    format.js
  end
end

在我的新分配页面上,我创建了这个

<% @porters.each do |porter| %>

  <%= porter.email %>

  <%= render 'assign_hostel_form' %>

<% end %>

下面的assign_hostel_form部分

<%= form_for @assign_hostel, url: accommodation_create_assign_hostel_path(:hostel_id => @hostel.id) do |f| %>

  <%= f.hidden_field :hostel_id, value: @assign_hostel.hostel_id %>

  <%= f.hidden_field :user_id, value: @assign_hostel.user_id %>

  <%= f.submit "Assign" %>
<% end %>

但点击分配按钮后,似乎没有选择任何宿舍或用户 ID。请问我该如何解决这个问题。

4

1 回答 1

0

在我看来,这是一段经典的has_many :through关系:

在此处输入图像描述

为什么不试试这个:

class User < ActiveRecord::Base
  has_many :hostels, :class_name => 'Hostel', :through => :assign_hostels, dependent: :destroy
  has_many :assign_hostels, :class_name => 'AssignHostel'

  attr_accessible :email, :password, :first_name, :lastname, :oname
  rolify
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

end

class Hostel < ActiveRecord::Base

  has_many :users, :class_name => 'User', :through => :assign_hostels, dependent: :destroy
  has_many :assign_hostels, :class_name => 'AssignHostel'

  attr_accessible :name, :location, :picture
  default_scope :order => 'id DESC'
end
于 2013-10-16T08:47:01.493 回答