2013-04-25 2 views
2

Я хотел бы создать галерею изображений в rails. Я создал настройку, которая позволяет вам создавать альбом и загружать фотографии на него. Однако я сфокусирован на том, как я могу позволить пользователю установить одно из существующих изображений в качестве обложки альбома в индексном представлении изображения.
У кого-нибудь есть идеи? Я обнаружил, что если бы я использовал переключатели, я не мог бы определить, как определить, какое изображение было выбрано ajax. Я также не знаю, как бы я заставил установить только одно изображение в качестве обложки альбома.Альбомы в rails

Вот мои настройки:

Контроллер

class Admin::AlbumsController < ApplicationController 
    respond_to :html, :json 
    def index 
    @albums = Album.all 
    end 
    def new 
    @album = Album.new 
    end 
    def create 
    @album = Album.new(params[:album]) 
    if @album.save 
     flash[:notice] = "Successfully created album!" 
     redirect_to [:admin, :albums] 
    else 
     render "new" 
    end 
    end 
    def edit 
    @album = Album.find(params[:id]) 
    end 
    def show 
    @album = Album.find(params[:id]) 
    end 
    def update 
    @album = Album.find(params[:id]) 
    @album.update_attributes(params[:album]) 
    if @album.update_attributes(params[:album]) 
     respond_with @album 
     flash[:notice] = "Successfully updated Album" 
    else 
     render "edit" 
    end 
    end 
    def destroy 
    @album = Album.find(params[:id]) 
    @album.destroy 
    @id = @album.id 
    FileUtils.remove_dir("#{Rails.root}/public/uploads/image/picture/#{@id}", :force => true) 
    respond_to do |format| 
     format.js { render :layout => false } 
    end 
    redirect_to admin_albums_path 
    end 
    def random_image 
    @image_files = %w(.jpg .gif .png) 
    @files ||= Dir.entries(
     "#{RAILS_ROOT}/public/uploads").delete_if { |x| 
     [email protected]_files.index(x[-4,4]) 
     } 

    file = @files[rand(@files.length)]; 
    @files.delete file 

    return "/images/logos/#{file}" 
    end 
    def ajaxUpdate 
    @album = Album.find(params[:album_id]) 
    @image = @album.images.find(params[:albumcover]) 
    if @image.update_attributes(params[:image]) 
     flash[:notice] = "Successfully updated Image" 
    else 
     render "edit" 
    end 
    end 

end 
class Admin::ImagesController < ApplicationController 
    respond_to :html, :json 
    #before_filter :split_hash, :only => [ :create, :update ] 
    def index 
     @album = Album.find(params[:album_id]) 
     @images = @album.images.all 
    end 
    def new 
     @album = Album.find(params[:album_id]) 
     @image = @album.images.new 
    end 
    def create 
     params[:image][:source].each do |image| 
      @album = Album.find(params[:album_id]) 
      @params = {} 
      @params['source'] = image 
      @image = @album.images.create(@params) 
     end 
     if @image.save 
      if params[:image][:source].size > 1 
       flash[:notice] = "Successfully added images!" 
      else 
       flash[:notice] = "Successfully added image!" 
      end 
      redirect_to [:admin, @album, :images] 
     else 
      render "new" 
      flash[:notice] = "Did not successfully add image :(" 
     end 
    end 
    def show 
     @album = Album.find(params[:album_id]) 
     @image = @album.images.find(params[:id]) 
    end 
    def edit 
     @album = Album.find(params[:album_id]) 
     @image = @album.images.find(params[:id]) 
    end 
    def update 
     @album = Album.find(params[:album_id]) 
     @image = @album.images.find(params[:id]) 
     if @image.update_attributes(params[:image]) 
      redirect_to [:admin, @album, :images] 
      flash[:notice] = "Successfully updated Image" 
     else 
      render "edit" 
     end 
    end 
    def destroy 
     @album = Album.find(params[:album_id]) 
     @image = @album.images.find(params[:id]) 
     @image.destroy 
     @albumid = @album.id 
     @id = @image.id 
     FileUtils.remove_dir("#{Rails.root}/public/uploads/image/picture/#{@albumid}/#{@id}", :force => true) 
     redirect_to admin_album_images_path(@album) 
    end 
    def ajaxUpdate 
     @album = Album.find(params[:album_id]) 
     @image = @album.images.find(params[:albumcover]) 
     if @image.update_attributes(params[:image]) 
      flash[:notice] = "Successfully updated Image" 
     else 
      render "edit" 
     end 
    end 
    #  def split_hash 
    #   @album = Album.find(params[:album_id]) 
     # @image = @album.images 
    #  array_of_pictures = params[:image][:picture] 
    #  array_of_pictures.each do |pic| 
    #   size = array_of_pictures.size.to_i 
    #   size.times {@image.build(params[:image], :picture => pic)} 
    #   @image.save 
     # end 
    #  end 
end 

Модели

class Album < ActiveRecord::Base 
    attr_accessible :title, :description, :album_id 
    has_many :images, :dependent => :destroy 
    validates :title, :description, :presence => true 
end 
class Image < ActiveRecord::Base 
    attr_accessible :title, :description, :source, :album_id, :albumcover, :image, :image_id 
    belongs_to :album 
    accepts_nested_attributes_for :album 
    mount_uploader :source, PictureUploader 
end 

Посмотреть

<% content_for :head do %> 
    <%= stylesheet_link_tag 'admin/images' %> 
    <%= javascript_include_tag "admin.js" %> 
<% end %> 
<% content_for :menu do %> 
    <li class="menu_item"><%=link_to "New Album", :controller => "albums", :action => "new" %></li> 
    <li class="menu_item"><%= link_to "Add Images", {:controller => "images", :action => "new"}, :class => "highlight_menu"%> </li> 
<% end %> 
<%= link_to "< Back", admin_albums_path, :id => "return_link" %> </br> 
<h1 class="section-title"> <strong style="font-weight: 600;"><%=best_in_place [:admin,@album], :title, :ok_button => :confirm %></strong></h1> 
<h4 class="album-desc"><%= best_in_place [:admin,@album], :description, :type => :textarea, :ok_button => :confirm%></h4> 

<%= form_tag admin_album_images_path(@album) do %> 
<% if [email protected]? %> 
    <% @images.each do |image| %> 
     <div class="item"> 
      <div class="image-box"> 
       <div class="source"> 
        <%= image_tag image.source %> 
       </div> 
      </div> 
      <div class="info"> 
       <div class="item-links"> 
        <%= link_to "Edit", edit_admin_album_image_path(@album, image.id), :id => "edit"%> 
        <%= link_to "Delete", 
         admin_album_image_path(@album, image.id), 
         :class => "item-link delete-image", 
         :method => :delete, 
         :remote => true, 
         :confirm => "Are you sure?" %> 
       </div> 
      </div> 
     </div> 
     <% end %> 
    <% else %> 
     <p class="alert">No images in this album</p> 
    <% end %> 
<% end %> 

Ответить!

* albums_controller *

def albumCoverSet 
    @album = Album.find(params[:album_id]) 
    @image = @album.images.find(params[:albumcover]) 
    if @image.update_attributes(params[:image]) 
     flash[:notice] = "Successfully updated Image" 
    else 
     render "edit" 
    end 
    end 

* альбом вид *

<div class="image"> 
     <%= image_tag album.images.find(album.albumcover_id).source, :class => "image" %> 
    </div> 

модель

class Album < ActiveRecord::Base 
    attr_accessible :title, :description, :album_id, :albumcover_id 
    has_many :images, :dependent => :destroy 
    has_one :albumcover, :class_name => "Image" 
    validates :title, :description, :presence => true 
end 
+0

Не могли бы вы объяснить, почему радиокнопки не будут работать? Вы должны иметь возможность указывать идентификатор для каждого изображения на стороне клиента. Затем, выбрав радиокнопку, будет добавлено сообщение о том, что изображение с этим идентификатором должно быть обложкой. Вы также можете сделать это щелчком (или даже всплывающим меню) на изображении. – bchurchill

ответ

2

Вы можете добавить 'primary_image_id' для альбома в миграции.

has_one :primary_image, :class_name => 'Image' 

В вашей форме, вы можете показать все альбомы.имя и выбрать ее. Радиокнопки должны работать нормально.

При отправке значения параметра будет задано значение primary_image_id.

+0

Я проверю его и обновит, если я заработаю! Благодаря! –

+0

Получил! Благодаря!. Я разместил свой код, который использовал –

+0

. Я использую этот подход - для «кеширования» значений (или денормализации базы данных), сохраняя значение в записи, особенно если вы показываете запись в списке. Другой подход поместить «первичный» логический образ на изображение более беспорядочно, чтобы быть в курсе последних событий. Удачи! – Swards

Смежные вопросы