0

I created a form to add a record to :vote model that belongs to :article model. As you can see below, the form to create the :vote record is in a :article view. In not using nested routes for these models so instead of using the form_for helper, I'm using plain form_tags. My problem is that strong_parameters is not allowing my hidden field through.

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

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

<p>
<strong>Body:</strong>
<%= @article.body %>
</p>

<p>
<strong>User:</strong>
 <%= @article.user_id %>
</p>

<%= form_tag("/vote/#{@article.id}", method: :post) do -%>
<%= hidden_field_tag 'vote[value]', 1 %>
<%= submit_tag 'Up vote' %>
<% end -%>

<%= link_to 'Edit', edit_article_path(@article) %> 
<%= link_to 'Back', articles_path %> 

As you can see in the controller code, I have white listed the the param and the log data show the post body coming in the right format for the parameters hash but it won't reach my create action.

class VotesController < ApplicationController

def create
    @article = Article.find(params[:id])
    @vote = Vote.new(params[:strong_vote])
    @vote.user_id = current_user.id
    @vote.article_id = @article.id
    @vote.save
    redirect_to @article

end


private

def strong_vote
    params.require(:vote).permit(:value)
end


end

     Processing by VotesController#create as HTML Parameters:{"utf8"=>"✓","authenticity_token"=>"Y6eBxpwGXGdT2toeUrxAlLW58Hj8Eux+SvoWeVUoYa8=","vote"=>{"value"=>"1"}, "commit"=>"Up vote","id"=>"7"}
     Article Load (0.1ms)  SELECT  "articles".* FROM "articles"  WHERE  "articles"."id" = ? LIMIT 1  [["id", 7]]
     User Load (0.1ms)  SELECT  "users".* FROM "users"  WHERE"users"."id" = 1  ORDER BY "users"."id" ASC LIMIT 1
     Rendered text template (0.0ms)
     Completed 200 OK in 7ms (Views: 1.0ms | ActiveRecord: 0.4ms)

Here are my routes in case they may be helpful.

devise_for :users
root 'articles#index'

resources :articles

post '/vote/:id' => 'votes#create'

Update: I tried your answer doz87 but I get the following error:

ArgumentError in VotesController#create
When assigning attributes, you must pass a hash as an argument.

Extracted source (around line #5):
3
4
5
6
7
8

    def create
        @article = Article.find(params[:id])
        @vote = Vote.new(:strong_vote)
        @vote.user_id = current_user.id
        @vote.article_id = @article.id
        @vote.save

Rails.root: /home/w/Folders/playground/ruby/voter

Application Trace | Framework Trace | Full Trace
app/controllers/votes_controller.rb:5:in `create'
Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"AVKHgcsOwQhwWJGfSGQhIL1Lbr7yhSRaGKTrxuLcAuo=",
 "vote"=>{"value"=>"1"},
 "commit"=>"Up vote",
 "id"=>"7"}
walt
  • 11
  • 3
  • Yeah your passing in a symbol to the Vote.new statement that requires a hash. If you used strong_vote without the colon then your passing in the parameter hash you defined in the controller. – doz87 Nov 16 '14 at 21:10

1 Answers1

1

The reason this isn't working is because your not assigning anything to the new Vote. Params[:strong_vote] doesn't exist

@vote = Vote.new(params[:strong_vote])

You should write it like this:

@vote = Vote.new(strong_vote)

Also it's good practice to catch any errors from a failed save. You should wrap @vote.save in an if block incase something goes wrong.

if @vote.save
redirect_to @article
else
flash.now[:notice] = "Something went wrong while saving"
render 'new'
end
doz87
  • 591
  • 6
  • 15
  • Actually..for some very weird reason..I deleted the strong param function and rewrote and it worked..but its written exactly the same....oh well Thanks @doz87 – walt Nov 16 '14 at 19:59