2016-11-17 12 views
1

私はajaxを使用せずに、レールプロジェクト用のボタンのような単純なものを実装しようとしています。私はRails params.requireが表示されない

param is missing or the value is empty: vote 

を、私は、これは何の投票パラメータは、私の要求で送信されていないことを意味していることを得るが、この時点では:私は私が考えることができるすべてのものを試してみたが、それはというエラーを取得するダウンに来続けますそれを動作させるために何を試してみるべきかわからない。

class VotesController < ApplicationController 

    def index 
    @votes = Vote.all 
    end 

    def new 
    @vote = Vote.new 
    end 

    def create 
    @vote = Vote.new(vote_params) 


    if @vote.save 
     puts @vote 
     flash[:notice] = "Thanks for voting!" 
     redirect_back(fallback_location: root_path) 
    else 
     puts "No" 
     flash[:notice] = "Something went wrong" 
     redirect_back(fallback_location: root_path) 
    end 
    end 

    def show 
    @vote = Vote.find(params[:id]) 
    end 

    def destroy 
    @vote = Vote.find(params[:id]) 
    if @vote.destroy! 
     flash[:notice] = "Unvoted!" 
     redirect_to user_path(current_user) 
    end 
    end 

    private 

    def vote_params 
    params.require(:vote).permit(:food_id, :user_id) 
    end 
end 

<%= form_for [@user, @vote] do |f| %> 
    <%= hidden_field_tag 'food_id', food.id %> 
    <%= hidden_field_tag 'user_id', current_user.id %> 
    <%= f.submit %> 


<% end %> 

ユーザ/ show.html.erb

<h2>Hey <%= @user.firstname %>!</h2> 
<p>Check out these dank Soups and Salads you've served up or <%= link_to "Upload some new Soup or Salad", new_food_path %></p> 

    <strong>Image:</strong> 
    <% @user.foods.each do |food| %> 
    <% vote = current_user.votes.where(food_id: food.id).first %> 
    <h3><%= link_to food.title.capitalize, food_path(food.id) %></h3> 
    <p><%= link_to (image_tag (food.image.url)), food_path(food.id) %></p> 
    <%= render 'shared/vote_form', :food => food, :vote => vote %> 
    <%= link_to "Delete", food, method: :delete, data: {confirm: "Really delete this article?"} %> 
    <% end %> 

class Vote < ApplicationRecord 
    belongs_to :user 
    belongs_to :food 
end 

resources :users do 
    resources :votes 
    end 

    resources :foods 

答えて

0

フォームオブジェクトfを使用していないため、params[:vote]で送信されていません。フォームオブジェクトを使用しない場合、それらは直接送信されます(params[:food_id]params[:user_id]の値をチェックしてみてください)。

はこれを試してみてください:

<%= form_for [@user, vote] do |f| %> 
    <%= f.hidden_field 'food_id', food.id %> 
    <%= f.hidden_field 'user_id', current_user.id %> 
    <%= f.submit %> 
<% end %> 
+0

いいえ、あなたは彼らがに表示されませんので、なぜ、フォームオブジェクト 'F'を使用していません'params [:votes]'。 – Rashmirathi

+0

申し訳ありませんが、私が取り組んでいるものの間違ったコピーを投稿しました。ブロック表記でも試しましたが、同じエラーが表示されます。 –

+0

@HarryB。フォームを送信した後、 'params'の値がどのように見えるかを投稿できますか? – Rashmirathi

0

はVotesControllerにユーザーを設定してください。また、特定のエラーを表示するために、コンソールに正確に何が表示されているかを共有しようとしてください。

HTML:

<%= render partial: 'shared/vote_form', locals: {:user => @user, :food => food, :vote => vote}%> 

ヒント: @userがCURRENT_USERことになっているならば、CURRENT_USERオブジェクト は@user代わりに使用します!

フォーム:

<%= form_for [user, vote] do |f| %> 
    <%= f.hidden_field_tag 'food_id', food.id %> 
    #no need to pass current_user, we are gonna use in controller 
    <%= f.submit %> 
<% end %> 

コントローラー:

class VotesController < ApplicationController 
    before_action :set_user 

def create 
    @vote = Vote.new(vote_params) 
    @vote.user_id = current_user.id 

    if @vote.save 
     puts @vote 
     flash[:notice] = "Thanks for voting!" 
     redirect_back(fallback_location: root_path) 
    else 
     puts "No" 
     flash[:notice] = "Something went wrong" 
     redirect_back(fallback_location: root_path) 
    end 
end 

private 
    def set_user 
     @user = User.find(params[:user_id]) 
    end 
end 
関連する問題