2016-05-16 17 views
0

私はRoRで新しく、現在はWebアプリケーションを構築しようとしています。 私はポストを持っているユーザーと古典的なアプリを持っています。オーダーごとにボタンを表示

他のモデルオンラインは一般的な壁にポストを置くために使用され、利用可能な部分を表す入れ子式の注文に関連付けられています。

ユーザーが自分の投稿をオンラインにプッシュすると、利用可能な部分ごとにフォームが生成されます。

ここで、私がしたいことは、各パーツのボタンを作成し、使用可能なパーツのステータスを変更することです。

私のコード:

Posts_controller:

class PostsController < ApplicationController 
 
    before_action :authenticate_user! 
 
    before_action :set_post, only: [:show, :edit, :update, :destroy] 
 
    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

Onlines_controller:

class OnlinesController < ApplicationController 
 
    before_action :authenticate_user! 
 
    before_action :set_post 
 
    before_action :owned_online, only: [:new, :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 edit 
 
    end 
 

 
    def create 
 
     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 update 
 
    if @onlines.update(online_params) 
 
     if @online.push == false 
 
     if @online.portion <= 0 
 
      @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, orders_attributes: [:id, :taked, :taked_at, :taked_by, :validated_at, :validated_by, :_destroy]) 
 
    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

ビュー/記事/ショー:

<div class="col-md-9"> 
 
    <h3>Orders :</h3> 
 
    <div id="ingredients"> 
 
     
 
     <ul> 
 
     <%- @post.onlines.orders.each do |order| %> 
 
     <li> 
 
      <button> 
 
      <%= order.id %> 
 
      </button> 
 
     </li> 
 
     <%end%> 
 
     </ul> 
 
    </div> 
 
    </div>

ですから、そのためにどんなアドバイスを持っている場合、私はそれを取りますよ!
ありがとう

答えて

0

私が使って以来、Railsが魔法を追加していない限り、@ post変数を投稿コントローラの "show"メソッド内に割り当てる必要があります。今、@postはおそらくあなたの 'ショー'ビューのために存在しません。

そこから、あなたの「投稿」モデルには「注文」に至るための適切な関連が必要です。 @postオブジェクト(@ post.objects.orders)を逆参照する方法は、投稿:has_many onlinesとオンライン:has_manyの注文を示唆しています。これらの関連付けは、PostとOnlineモデルで設定する必要があります。

私はここにお勧めします:http://guides.rubyonrails.org/action_controller_overview.html#methods-and-actions 、ここに: http://guides.rubyonrails.org/association_basics.html

この時点から軌道に乗るために。がんばろう!

+0

ありがとう、私は現在この団体を持っていますが、問題はショービュー内の私の情報が確立されていないため、表示されず、なぜ私は理解できないのですか?成分を使って同じことをしてください –

+0

ポストコントローラの表示方法に「@post」割り当てを追加しましたか?それがなければ、 "@post"はレンダリングするビューに対して存在しません。 –