Rails:如何在相册/新表单中添加图片专辑的用户所有权?

时间:2012-10-05 19:46:38

标签: ruby-on-rails

您好我正在开发我的第一个rails项目,一个供用户制作相册和上传图片的网站。我已将注册,登录和友情安装到我的应用程序中。我正在尝试制作它,以便在相册创建表单中,您可以看到您的朋友列表,并选择您想要共享对该相册的访问权限(意味着您选择的任何人也将成为@album.users的一部分我打算使用一个复选框(我想不出更好的方法)来做出这个选择。但是,我不知道如何将friendship模型与专辑/新表格联系起来。这是我的表单如何:

相册/ new.html.erb

<%= form_for ([@user, @album]), :html => { :id => "uploadform", :multipart => true } do |f| %>
<div class="formholder">
    <%= f.label :name %>
    <%= f.text_field :name %>

    <%= f.check_box :friends %>

    <%= f.label :description %>
    <%= f.text_area :description %>

    <br>

    <%=f.submit %>
</div>
<% end %>

第6行( <%= f.check_box :friends %>

发生错误

错误:

undefined method 'friends' for #<Album:0x007fa3a4a8abc0>

我能理解为什么,但我不知道如何解决它。我有典型的友情加入模式来添加朋友,我希望能够看到所有朋友的列表并选择它们。我认为接下来的步骤是在相册控制器的创建操作中添加类似@album.users << @user.friendships.find_by_name(params[:friends])的内容,但我不知道如何遍历只为朋友返回一个参数的表单?

以下是我的文件:

专辑控制器创建动作:

    def create
      @user = User.find(params[:user_id])
      @album = @user.albums.build(params[:album])
      # not so sure about the following line.
      @album.users << @user.friendships.find_by_name(params[:friends])
      respond_to do |format|
        if @user.save
          format.html { redirect_to user_album_path(@user, @album), notice: 'Album was successfully created.' }
          format.json { render json: @album, status: :created, location: @album}
        else
          format.html { render action: "new" }
          format.json { render json: @album.errors, status: :unprocessable_entity }
        end
      end 
    end

专辑模型

class Album < ActiveRecord::Base
  attr_accessible :name, :description
  validates_presence_of :name

  has_many :album_users
  has_many :users, :through => :album_user
  has_many :photos

end

用户模型

class User < ActiveRecord::Base

has_secure_password
attr_accessible :email, :name, :password, :password_confirmation
validates_presence_of :password, :on => :create

validates_format_of :name, :with => /[A-Za-z]+/, :on => :create
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
validates_length_of :password, :minimum => 5, :on => :create

has_many :album_users
has_many :albums, :through => :album_users
accepts_nested_attributes_for :albums

has_many :friendships
has_many :friends, :through => :friendships

before_save { |user| user.email = email.downcase }
before_save :create_remember_token

private

  def create_remember_token
    self.remember_token = SecureRandom.urlsafe_base64
  end

album_user模型(连接表在多个用户和用户之间建立多对多关系,其中有很多用户)

class AlbumUser < ActiveRecord::Base
  belongs_to :album
  belongs_to :user
end

友谊模式

class Friendship < ActiveRecord::Base
  attr_accessible :friend_id

  belongs_to :user
  belongs_to :friend, :class_name => "User"
end

如果您需要更多信息,请告诉我!在此先感谢!!!

1 个答案:

答案 0 :(得分:1)

您应该将users_ids(是,两个“s”)添加到Album的可访问属性列表中,然后在:users_ids字段上使用“选择多个”。< / p>

<%= f.collection_select(:users_ids, User.all, :id, :name, :multiple => true) %>