首页 > 解决方案 > 使用 patch 方法从 form_for 传递时,Param 返回 nil 值

问题描述

我正在实施一个投票系统,当课程已经被赞成/反对时,单击反对/反对将分别切换到该投票,再次单击将删除该投票(类似于 Reddit)。虽然投票和销毁投票正确执行,但我在尝试使用 form_for 和 patch 方法更新投票时遇到问题,其中 vote_type 的值返回 nil

我的投票控制器

class VotesController < ApplicationController
     def create
       @vote = Vote.new(secure_params)

       @vote.course = Course.find(params[:course_id])
       if @vote.save
           respond_to do |format|
                   format.html { redirect_to :courses }
                   format.js
         end
     end



    def update
          vote = Vote.find_by(user: current_user)

          vote.update_attribute(:vote_type, update_vote_params)
          redirect_to :courses
    end   

    def destroy
          vote = Vote.find_by(user: current_user)
          vote.destroy
          redirect_to :courses, :notice => 'Unvoted!'
    end   

    private
       def secure_params
          params.require(:vote).permit( :user_id, :vote_type )
       end

       def update_vote_params
          params.require(:vote).permit(:vote_type)
       end
  end  

我的 index.html.erb

<% if  Vote.exists?(user: current_user) && Vote.find_by(user: current_user).vote_type.equal?(-1) %>

            <%= form_for course.votes.build, url: course_vote_path(course, Vote.find_by(user: current_user).id), method: :patch do |f| %>
              <%= f.hidden_field :vote_type, value: 1 %>
              <%= f.submit 'Upvote', class: 'btn btn-default' %>
            <% end %>

        <% elsif Vote.exists?(user: current_user) && Vote.find_by(user: current_user).vote_type.equal?(1) %>
            <%= form_for course.votes.build, url: course_vote_path(course, Vote.find_by(user: current_user).id), method: :delete do |f| %>
            <%= f.submit "Upvote", class: 'btn btn-default' %>
            <% end %>
        <% else %>
            <%= form_for course.votes.build, url: course_votes_path(course) do |f| %>
              <%= f.hidden_field :user_id, value: current_user.id %>
              <%= f.hidden_field :vote_type, value: 1 %>
              <%= f.submit 'Upvote', class: 'btn btn-default' %>
            <% end %>
        <% end %>

我的路线.rb

 Rails.application.routes.draw do
     get 'vote/create'
     get 'vote/destroy'
     get 'courses/new'
     get 'users/new'
    resources :courses do
          resources :votes, only: [:create, :destroy, :update]
    end
    resources :users
 end

我希望参数为 vote_type 传递 1,但是,实际输出为 nil

标签: htmlruby-on-railsruby

解决方案


推荐阅读