ruby-on-rails ruby model-view-controller params railscasts

ruby on rails - ¿Cómo usar el envío privado para ocultarlo del perfil?



ruby-on-rails model-view-controller (1)

Agregue un campo ''privado'' al modelo de Usuario con su valor predeterminado ''falso''. Toda la información de usuario normal se marcará como ''pública'' (porque el campo privado tiene el valor falso) Solo si params [: private], el valor del campo privado se establecerá en ''true''.

A continuación, puede agregar un método al modelo de usuario que solo captará los datos del usuario con el indicador privado = falso (para vistas públicas).

EDITAR:

Viendo público o privado:

Agregue un campo ''privado'' a cada uno de sus modelos relacionados que posiblemente se puedan marcar como privados. No olvide agregar esto en sus migraciones. Establezca el valor predeterminado del privado en falso .

Incluir en la valoración y migración del usuario / esquema

t.boolean :private, default: false

valuation.rb

def public? private == true ? false : true end

usuario.rb

# gets public valutations or nil, if there''s no public valutation def public_valuations valuations.find(&:public?) end

Haga esto de la misma manera para cada una de sus relaciones deseadas. Le permite obtener información pública a través de

@valuations = @user.public_valuations

Su acción show actual muestra ahora todas las informaciones adicionales del usuario, públicas y privadas, que solo deben mostrarse si current_user = @user.

Por último, debes insertar una condición en tu acción de mostrar:

def show @user = User.find(params[:id]) if current_user == @user @habits = @user.habits @valuations = @user.valuations @accomplished_goals = @user.goals.accomplished @unaccomplished_goals = @user.goals.unaccomplished @averaged_quantifieds = @user.quantifieds.averaged @instance_quantifieds = @user.quantifieds.instance else @valuations = @user.public_valuations end end

Esa solución depende de current_user, es decir, debe tener un método que devuelva el objeto del usuario actualmente logged_in (tal vez en una sesión). Michael Hartl escribió un fantástico tutorial sobre autenticación de usuarios. * RubyonRailsBeginner utilizó Hartl Tutorial para esto :)

Crear registros públicos o privados

Como ha configurado el valor predeterminado del privado en falso , puede usar su código existente para crear entradas públicas.

Para entradas privadas, debe establecer el atributo correspondiente en su user_params en verdadero .

EDIT con params.require:

Establecí el [: private] en la cláusula else explícita en falso, para que un usuario pueda establecer sus atributos privados en público, si lo desea.

def user_params if params[:private] = true params.require(:user).permit(:name, :email, :password, :private, :password_confirmation, valuations_attributes: [:name, :tag_list, :private]) else params[:user][:valuations][:private] = false params.require(:user).permit(:name, :email, :password, :password_confirmation, valuations_attributes: [:name, :tag_list]) end end

Rails Api te da algunos consejos sobre parámetros potentes con atributos anidados.

¡Espero que ayude!

Cuando un usuario realiza una presentación private ¿cómo podemos ocultar la información enviada del feed y que otros usuarios puedan verla en su perfil público?

<%= button_tag(type: ''submit'', class: "btn") do %> ... <%= button_tag(type: ''submit'', class: "btn", id: "2", name: ''private'') do %> ...

Ponemos lo siguiente en el controlador, pero dado que el botón privado estará en muchas formas diferentes, ¿tengo que ponerlo en cada controlador o podemos ponerlo en el controlador de la aplicación?

if params[:private] # the private action / What do we need to put here? else # normal submit / and here?

Seguí este episodio ferroviario casi a la T para construir el feed de actividad: http://railscasts.com/episodes/406-public-activity .

Aquí está el código para el perfil público:

users_controller.rb

def show @user = User.find(params[:id]) @habits = @user.habits @valuations = @user.valuations @accomplished_goals = @user.goals.accomplished @unaccomplished_goals = @user.goals.unaccomplished @averaged_quantifieds = @user.quantifieds.averaged @instance_quantifieds = @user.quantifieds.instance end

show.html.erb

<% if @user.habits.any? %> <h2>Habits</h2> <h4>Challenges</h4> <%= render partial: ''habits'', locals: {habits: @habits} %> <% end %> <% if @user.valuations.any? %> <h2>Values</h2> <%= render @valuations %> <% end %> <% if @user.goals.any? %> <h2>Goals</h2> <h4> Current</h4> <%= render @unaccomplished_goals %> <% end %> <% if @user.goals.any? %> <h4>Accomplished</h4> <%= render @accomplished_goals %> <% end %> <% if @user.quantifieds.any? %> <h2>Stats</h2> <h4>Averaged</h4> <%= render partial: ''averaged'', locals: {habits: @averaged_quantifieds} %> <% end %> <% if @user.quantifieds.any? %> <h4>Instance</h4> <%= render partial: ''instance'', locals: {habits: @instance_quantifieds} %> <% end %>

Según lo solicitado :)

Modelo de usuario

class User < ActiveRecord::Base has_many :authentications has_many :habits, dependent: :destroy has_many :levels has_many :valuations, dependent: :destroy has_many :comments, as: :commentable has_many :goals, dependent: :destroy has_many :quantifieds, dependent: :destroy has_many :results, through: :quantifieds accepts_nested_attributes_for :quantifieds, :reject_if => :all_blank, :allow_destroy => true accepts_nested_attributes_for :results, :reject_if => :all_blank, :allow_destroy => true has_many :active_relationships, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy has_many :passive_relationships, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy has_many :following, through: :active_relationships, source: :followed has_many :followers, through: :passive_relationships, source: :follower attr_accessor :remember_token, :activation_token, :reset_token before_save :downcase_email before_create :create_activation_digest validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = //A[/w+/-.]+@[a-z/d/-.]+/.[a-z]+/z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }, unless: -> { from_omniauth? } has_secure_password validates :password, length: { minimum: 6 } def self.from_omniauth(auth) where(provider: auth.provider, uid: auth.uid).first_or_initialize.tap do |user| user.provider = auth.provider user.uid = auth.uid user.name = auth.info.name user.oauth_token = auth.credentials.token user.oauth_expires_at = Time.at(auth.credentials.expires_at) user.password = (0...8).map { (65 + rand(26)).chr }.join user.email = (0...8).map { (65 + rand(26)).chr }.join+"@mailinator.com" user.save! end end # Returns the hash digest of the given string. def User.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # Returns a random token. def User.new_token SecureRandom.urlsafe_base64 end # Remembers a user in the database for use in persistent sessions. def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end # Forgets a user. NOT SURE IF I REMOVE def forget update_attribute(:remember_digest, nil) end # Returns true if the given token matches the digest. def authenticated?(attribute, token) digest = send("#{attribute}_digest") return false if digest.nil? BCrypt::Password.new(digest).is_password?(token) end # Activates an account. def activate update_attribute(:activated, true) update_attribute(:activated_at, Time.zone.now) end # Sends activation email. def send_activation_email UserMailer.account_activation(self).deliver_now end def create_reset_digest self.reset_token = User.new_token update_attribute(:reset_digest, User.digest(reset_token)) update_attribute(:reset_sent_at, Time.zone.now) end # Sends password reset email. def send_password_reset_email UserMailer.password_reset(self).deliver_now end # Returns true if a password reset has expired. def password_reset_expired? reset_sent_at < 2.hours.ago end def good_results_count results.good_count end # Returns status feed. def feed following_ids = "SELECT followed_id FROM relationships WHERE follower_id = :user_id" Habit.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id) Valuation.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id) Goal.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id) Quantified.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id) end # Follows a user. def follow(other_user) active_relationships.create(followed_id: other_user.id) end # Unfollows a user. def unfollow(other_user) active_relationships.find_by(followed_id: other_user.id).destroy end # Returns true if the current user is following the other user. def following?(other_user) following.include?(other_user) end private def from_omniauth? provider && uid end # Converts email to all lower-case. def downcase_email self.email = email.downcase unless from_omniauth? end # Creates and assigns the activation token and digest. def create_activation_digest self.activation_token = User.new_token self.activation_digest = User.digest(activation_token) end end

Controlador de usuario

class UsersController < ApplicationController before_action :logged_in_user, only: [:index, :edit, :update, :destroy, :following, :followers] before_action :correct_user, only: [:edit, :update] before_action :admin_user, only: :destroy def index @users = User.paginate(page: params[:page]) end def show @user = User.find(params[:id]) @habits = @user.habits @valuations = @user.valuations @accomplished_goals = @user.goals.accomplished @unaccomplished_goals = @user.goals.unaccomplished @averaged_quantifieds = @user.quantifieds.averaged @instance_quantifieds = @user.quantifieds.instance end def new @user = User.new end def create @user = User.new(user_params) if @user.save @user.send_activation_email flash[:info] = "Please check your email to activate your account." redirect_to root_url else @feed_items = [] render ''pages/home'' end end def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) if @user.update_attributes(user_params) flash[:success] = "Profile updated" redirect_to @user else render ''edit'' end end def destroy User.find(params[:id]).destroy flash[:success] = "User deleted" redirect_to users_url end def following @title = "Following" @user = User.find(params[:id]) @users = @user.following.paginate(page: params[:page]) render ''show_follow'' end def followers @title = "Followers" @user = User.find(params[:id]) @users = @user.followers.paginate(page: params[:page]) render ''show_follow'' end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end # Before filters # Confirms a logged-in user. def logged_in_user unless logged_in? store_location flash[:danger] = "Please log in." redirect_to login_url end end # Confirms the correct user. def correct_user @user = User.find(params[:id]) redirect_to(root_url) unless current_user?(@user) end # Confirms an admin user. def admin_user redirect_to(root_url) unless current_user.admin? end end

ACTUALIZAR

Con la respuesta de K a continuación, aparece este mensaje de error al dirigirse a usuarios o usuarios / 1, usuarios / 2, etc.

Started GET "/users/1" for 127.0.0.1 at 2015-04-01 16:32:13 -0400 SyntaxError (/Users/galli01anthony/Desktop/Pecoce/app/controllers/users_controller.rb:79: syntax error, unexpected '':'', expecting keyword_end users_attributes: [:name, :email, :password, :... ^ /Users/galli01anthony/Desktop/Pecoce/app/controllers/users_controller.rb:79: syntax error, unexpected '','', expecting keyword_end ...ivate, :password_confirmation], valuations_attributes: [:nam... ... ^ /Users/galli01anthony/Desktop/Pecoce/app/controllers/users_controller.rb:79: syntax error, unexpected ''='', expecting keyword_end ... [:name, :tag_list, :private] = true ... ^ /Users/galli01anthony/Desktop/Pecoce/app/controllers/users_controller.rb:81: syntax error, unexpected '':'', expecting keyword_end users_attributes: [:name, :email, :password, :... ^ /Users/galli01anthony/Desktop/Pecoce/app/controllers/users_controller.rb:81: syntax error, unexpected '','', expecting keyword_end ...sword, :password_confirmation], valuations_attributes: [:nam... ... ^): app/controllers/users_controller.rb:79: syntax error, unexpected '':'', expecting keyword_end app/controllers/users_controller.rb:79: syntax error, unexpected '','', expecting keyword_end app/controllers/users_controller.rb:79: syntax error, unexpected ''='', expecting keyword_end app/controllers/users_controller.rb:81: syntax error, unexpected '':'', expecting keyword_end app/controllers/users_controller.rb:81: syntax error, unexpected '','', expecting keyword_end

Esta es una pregunta de dos partes. Encuentre la segunda parte aquí: ¿Cómo usar el envío privado para ocultar del feed?