he podido con éxito para poner en práctica la adición de nuevas entradas artista que no fue incluido en Ryan Bates Railscast # 258 http://railscasts.com/episodes/258-token-fieldsRieles: Usando tokeninput jQuery (Railscast # 258) para crear nuevas entradas
Así, en otras palabras, un usuario puede ingresar un nombre de artista que se autocompletará usando jquery tokinput. Sin embargo, me gustaría que los resultados de autocompletar solo muestren los nombres de los artistas que fueron creados por ese usuario individual.
¿Tiene esto sentido? Un ejemplo mejor y más comprensible sería un collection.rb, donde los usuarios crean publicaciones y especifican una "colección" para la publicación a la que pertenecen, pero solo deberían poder agregar publicaciones a las colecciones que ellos mismos crearon.
Ésta es la forma post con artist_tokens como un atributo virtual:
<%= form_for @post, :validate => true, :html => {:multipart => true} do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<div class="field">
<%= f.label :title, 'Title:' %><br />
<%= f.text_field :title %><br />
<%= f.label :artist_tokens, "Artists" %><br />
<%= f.text_field :artist_tokens, "data-pre" =>
@post.artists.map(&:attributes).to_json %>
</div>
<div class="actions">
<%= f.submit "Submit" %>
</div>
<% end %>
Esto encuentra el artista por el valor introducido en el campo artist_tokens en el formulario de correo, y también añade la opción "Añadir {params [: q]} "para agregar nuevas entradas.
class ArtistsController < ApplicationController
def index
@artists = Artist.where("name like ?", "%#{params[:q]}%")
results = @artists.map(&:attributes)
results << {:name => "Add: #{params[:q]}", :id => "CREATE_#{params[:q]}_END"}
respond_to do |format|
format.html
format.json { render :json => results }
end
end
Agregué el código adicional para analizar las 'nuevas' entradas por id y luego crear un nuevo artista con ellas. Luego los artist_ids se asignan nuevamente.
post.rb
def artist_tokens=(ids)
ids.gsub!(/CREATE_(.+?)_END/) do
Artist.create!(:name => $1).id
end
self.artist_ids = ids.split(",")
end
Todo funciona muy bien, excepto la capacidad de reducir los resultados JSON por sólo las entradas del CURRENT_USER. ¿Cómo voy a hacer esto? ¿Debo guardar el user_id del creador de las entradas en la tabla? ¿Cómo puedo hacer esto?
EDIT: asociaciones para modelos
# app/models/user.rb
class User < ActiveRecord::Base
has_many :posts
has_many :artists, :through => :posts
end
# app/models/post.rb
class Post < ActiveRecord::Base
belongs_to :user
has_many :artisanships
has_many :artists, :through => :artisanships
end
# all/models/artist.rb
class Artist < ActiveRecord::Base
has_many :artisanships
has_many :users, :through => :artisanships
has_many :posts, :through => :artisanships
end
# app/models/artisanship.rb
class Artisanships < ActiveRecord::Base
belongs_to :post
belongs_to :artist
has_one :user, :through => :post
end
EDIT: posts_controller.rb
class PostsController < ApplicationController
before_filter :authenticate_user!, :only => [:create, :edit, :update, :destroy]
before_filter :authorized_user, :only => [:destroy, :edit, :update]
def create
@user = current_user
@post = current_user.posts.build(params[:post])
if @post.save
flash[:success] = "Post created!"
redirect_to root_path
else
@feed_items = current_user.feed.paginate(:per_page => "10", :page => params[:page])
render 'pages/home'
end
end
def index
@posts = Post.paginate(:page => params[:page])
end
def show
@post = Post.find(params[:id])
end
def edit
@post = Post.find(params[:id])
end
def update
@post = Post.find(params[:id])
respond_to do |format|
if @post.update_attributes(params[:post])
format.html { redirect_to(post_path(@post), :notice => 'Post was successfully updated.') }
else
format.html { render :action => "edit" }
end
end
end
def destroy
@post.destroy
redirect_to root_path
end
def likers
@title = "Likers"
@post = Post.find(params[:id])
@likers = @post.likers.paginate(:page => params[:page])
render 'show_likers'
end
def search
if params[:q]
query = params[:q]
@search = Post.search do
keywords query
end
@posts = @search.results
end
end
private
def authorized_user
@post = Post.find(params[:id])
redirect_to root_path unless current_user?(@post.user)
end
Editar: Intento de alias_method_chain para establecer el atributo user_id del mensaje es el primero. (No funcionó arreglar las entradas nulo DB) referneced de: Rails 3: alias_method_chain still used?
def attributes_with_user_id_first=(attributes = {})
# Make sure not to accidentally blank out the important_attribute when none is passed in
if attributes.include?(:user_id)
self.user_id = attributes.delete(:user_id)
end
self.attributes_without_user_id_first = attributes
end
alias_method_chain :attributes=, :user_id_first
¿Qué es 'collection.rb' que lo mencionó anteriormente, pero lo omitió por completo más tarde. ¿Cómo se relacionan 'Post' y' Artist'? ¿Qué es exactamente lo que quiere hacer? – rubish
La publicación y el artista tienen una tabla unida llamada artesanías (que usa artist_ids y post_ids). Si está familiarizado con jquery tokeninput, agregué la posibilidad de agregar nuevas entradas. Me gustaría que la autocompletación solo incluya las entradas creadas por el usuario. –
Collection.rb no existe. Es solo un ejemplo para comprender mejor cómo me gustaría usar jquery tokeninput, puede pensar en colecciones en lugar de artistas. Un usuario crea una publicación y escribe un nombre de colección, si es una colección nueva seleccionan "agregar:" nuevo nombre de colección "si es una colección anterior, simplemente la seleccionan. Si un usuario crea una colección, solo puede seleccionar su propia colección. colecciones. ¿Tiene más sentido? –