lili pupu lili pupu - 6 months ago 13
Javascript Question

Désactivate the oldest post

I'm new in rails and I'm trying to build a web app, but I encounter the limits of my abilities.
I have a classic app with user who have posts, and to put this post in public, I create a model and a controller Online.
That I'm trying to do now, It's to change the boolean :push(from Online) in false if a new Online is created with the same post_id as before.
So if I push again my post 2, the previews Online associated with the post 2 will update their :push in false.
Well, if you have any ideas about that, let me know !
Thanks

My code =

Controllers:


  • Onlines :





class OnlinesController < ApplicationController
before_action :authenticate_user!
before_action :set_post
before_action :owned_online, only: [:new, :edit, :update]
before_action :set_online

def new
@online = current_user.onlines.build
@online.post_id = @post.id
@online.user_id = current_user.id
end

def create
@online.user_id = current_user.id
@online.post_id = @post.id
if Online.where(post_id: params[:post_id]).any?
@online = Online.where(post_id: params[:post_id]).last.update_attributes(push: false)
end
@online = @post.onlines.create(online_params)
if @online.save
if @online.portion <= 0
@online.update(push: false)
flash[:success] = 'Veuillez indiquer le nombre de parts disponibles '
redirect_to root_path
else
@online.update(pushed_at: Time.zone.now)
@online.update(push: true)
flash[:success] = 'Votre post est en ligne !'
redirect_to root_path
end
else
render 'new'
end
end

def show

end

def update
if @onlines.update(online_params)
if @online.push == false
if @online.portion <= 1
@online.update(push: false)
flash[:success] = 'Veuillez indiquer le nombre de parts disponibles '
redirect_to root_path
else
@online.update(push: true)

flash[:success] = 'Votre post a bien été pushé !'
redirect_to root_path
end
end
else
@user.errors.full_messages
flash[:error] = @user.errors.full_messages
render :edit
end
end


private

def online_params
params.require(:online).permit(:user_id, :post_id, :prix, :portion, :push, :pushed_at)
end

def owned_online
@post = Post.find(params[:post_id])
unless current_user == @post.user
flash[:alert] = "That post doesn't belong to you!"
redirect_to :back
end
end

def set_post
@post = Post.find_by(params[:post_id])
end


def set_online
@post = Post.find(params[:post_id])
@online = Online.find_by(params[:id])
end

end





Posts :



class PostsController < ApplicationController
before_action :authenticate_user!
before_action :set_post, only: [:show, :edit, :update, :destroy]
before_action :set_online
before_action :owned_post, only: [:edit, :update, :destroy]


# GET /posts
# GET /posts.json
def index
@posts = Post.push_posts

end


# GET /posts/1
# GET /posts/1.json
def show

end

# GET /posts/new
def new
@post = current_user.posts.build
end

# GET /posts/1/edit
def edit
end

# POST /posts
# POST /posts.json
def create
@post = current_user.posts.build(post_params)
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render :show, status: :created, location: @post }
else
format.html { render :new }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end

# PATCH/PUT /posts/1
# PATCH/PUT /posts/1.json
def update
respond_to do |format|
if @post.update(post_params)
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
format.json { render :show, status: :ok, location: @post }
else
format.html { render :edit }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end

# DELETE /posts/1
# DELETE /posts/1.json
def destroy
@post.destroy
respond_to do |format|
format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' }
format.json { head :no_content }
end
end



private
# Use callbacks to share common setup or constraints between actions.
def set_post
@post = Post.find(params[:id])
end




# Never trust parameters from the scary internet, only allow the white list through.
def post_params
params.require(:post).permit(:user_id, :title, :description, :image, ingredients_attributes: [:id, :name, :_destroy])
end

def owned_post
unless current_user == @post.user
flash[:alert] = "That post doesn't belong to you!"
redirect_to root_path
end
end

def set_online
@onlines = Online.find_by(params[:id])
end

end





Models


  • Online :





class Online < ActiveRecord::Base

belongs_to :post
belongs_to :user


scope :push, ->{ where(push: true).order("pushed_at DESC") }


end






  • Post :





class Post < ActiveRecord::Base


belongs_to :user
has_many :onlines, dependent: :destroy

scope :push_posts, lambda { joins(:onlines).merge(Online.push) }

has_many :ingredients, dependent: :destroy



accepts_nested_attributes_for :ingredients, reject_if: :all_blank, allow_destroy: true

has_many :comments

validates :image, presence: true

has_attached_file :image, styles: { medium: "300x300#"}, default_url: "/images/:style/missing.png"
validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
end





& finaly, the view to display the index of post :




<div class="row">
<%- @posts.each do |post|%>
<%- if post.onlines.last.push == true %>
<div class="post">
<div class="form-group text-center">
<h3> <%=post.title%></h3>
</div>


<p> Posted by : <%= link_to post.user.pseudo, profile_path(post.user.pseudo) %>, <%= time_ago_in_words(post.onlines.last.pushed_at) %> ago </p>



<p><%= post.onlines.last.prix %></p>
<p><%= post.onlines.last.portion %></p>

<div class="image text-center">
<div class="image-border">
<%= link_to (image_tag post.image.url(:medium), class: 'img-responsive'), post_path(post)%>
</div>
</div>



</div>
<% end %>
<%end%>
</div>
</div>
</div>





Thanks for your times !!

Answer

You probably would put it into the controller action where you can use

YourModel.where(post_id: params[:post_id]).update_all(push: false)

or something similar. It kind of depends what you want to do if you create more than 2 items with the same post_id

Comments