2017-05-05 4 views
1

Ich erhalte einen Fehler bei meiner set_project-Methode in meinem Projekt-Controller. Nach dem Fehlerbildschirm ich sehen werde, sind die Parameter übergeben wird, wie folgt:link_to übergibt falsche Parameter an den Controller

{ "project_id" => "8", "id" => "add_vote"}

denke ich, die Nummer 8 Was sollte übergeben werden? Hier ist meine Projekte Controller:

class ProjectsController < ApplicationController 
    before_action :set_project, only: [:show, :edit, :update, :destroy] 
    before_action :set_all_votes, only: [:show, :update] 

    # GET /projects 
    # GET /projects.json 
    def index 
    @projects = Project.all 
    @votes = Vote 
    end 

    # GET /projects/1 
    # GET /projects/1.json 
    def show 
    end 

    # GET /projects/new 
    def new 
    @project = Project.new 
    end 

    # GET /projects/1/edit 
    def edit 
    end 

    # POST /projects 
    # POST /projects.json 
    def create 
    @project = Project.new(project_params) 

    respond_to do |format| 
     if @project.save 
     format.html { redirect_to @project, notice: 'Project was successfully created.' } 
     format.json { render :show, status: :created, location: @project } 
     else 
     format.html { render :new } 
     format.json { render json: @project.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

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

    # DELETE /projects/1 
    # DELETE /projects/1.json 
    def destroy 
    @project.destroy 
    respond_to do |format| 
     format.html { redirect_to projects_url, notice: 'Project was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 


    def add_vote 
    unless params[:project_id].nil? 
     @project = Project.find(params[:project_id]) 
     @newVote = Vote.create!(vote_value: true, user_id: current_user.id, project_id: @project.id) 
     respond_to do |format| 
     format.html { redirect_to @project, notice: 'Your vote has been recorded'} 
     format.json { render :show, status: :ok, location: @project } 
     end 
    end 
    end 


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

    def set_all_votes 
     @votes = Vote.all 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def project_params 
     params.require(:project).permit(:title, :video_url, :description, :images, :team_name, :vote_count) 
    end 
end 

Hier ist meine Projekte zeigen Seite. Wenn Sie auf die Schaltfläche "Für dieses Projekt abstimmen" klicken, wird der Fehler ausgelöst.

<p id="notice"><%= notice %></p> 


<p> 
    <strong>Title:</strong> 
    <%= @project.title %> 
</p> 

<p> 
    <strong>Video url:</strong> 
    <%= @project.video_url %> 
</p> 



<iframe src='https://www.youtube.com/watch?v=HbW-Bnm6Ipg' frameborder='0' allowfullscreen></iframe> 




<p> 
    <strong>Description:</strong> 
    <%= @project.description %> 
</p> 

<br><br> 


<div class="voteButton"> 
    <%= link_to "<button>Vote for this project</button>".html_safe, add_vote_path(:project_id => @project.id) %> 
</div> 
<br><br> 

<%= link_to 'Edit', edit_project_path(@project) %> | 
<%= link_to 'Back', projects_path %> 

Hier ist meine Routen-Datei:

Rails.application.routes.draw do 
    devise_for :users 
    resources :votes 
    resources :projects 
    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
    root 'projects#index' 


    controller :projects do 
    get '/projects/add_vote' => 'projects#add_vote', as: :add_vote 
    end 

end 

Antwort

2

Ihre Route angeben derzeit nicht, dass es einen Parameter benötigt. Versuchen Sie dies für Ihre Route statt:

controller :projects do 
    get 'add_vote/:project_id', to: 'projects#add_vote', as: :add_vote 
end 

rails routes ist ein nützliches Werkzeug Routing-Probleme für das Debuggen.

1

Wenn Sie rake routes in Konsole eingeben werden Sie sehen, dass aufgrund Ihrer resources :projects Sie haben eine /projects/:id Route, die ist, was /projects/add_vote ist tatsächlich ist muster abgestimmt. Wenn eine neue Anfrage eingeht, sucht der Router nach einer Routenübereinstimmung, die von oben nach unten in der Liste der Rake-Routen verläuft. Um dies zu beheben, können Sie das Pfandrecht mit resources :projects unter add_vote verschieben.

Außerdem glaube ich, es wäre hilfreich, Ihren add_vote Pfad enthält die ID des Projektes zu ändern:

get '/projects/:id/add_vote' => 'projects#add_vote', as: :add_vote 

Dies wird den zusätzlichen Vorteil der nicht passenden /projects/:id wie Ihre aktuelle Situation hat. Ihr Link wird dann:

<%= link_to "<button>Vote for this project</button>".html_safe, add_vote_path(@project) %> 
Verwandte Themen