Rob Hughes
Rob Hughes

Reputation: 906

Rails 4. Attribute not saving when creating model

I am stumped as to why this isn't working. I have a review system, and a link to create a new review passing 2 attributes; user_id and gigid. Both id's are being generated as integers but when I save the review, the gigid saves as 'nil' rather than the integer.

View:

<%= link_to 'Click here to rate this user', new_user_review_path(:user_id => request.user.id, :gigid => request.gig.id) %>

Here both ID's are set correctly (according to server output). User_id is the user which is to be reviewed (works correctly) and gigid is a reference for post validation. (works correctly until I try and save)

_form :

<%= simple_form_for([@user, @user.reviews.build]) do |f| %>
<div id="rating-form">
<label>Rating</label>
</div>
<%= f.input :comment %>
<%= f.button :submit %>

<% end %>

Controller:

def new
    if user_signed_in?
    @review = current_user.reviews.new
  else
    redirect_to(root_url)
    flash[:danger] = "You must log in to rate a user"
  end
  end

def create
    @review = @user.reviews.new review_params
    @review.reviewed_id = current_user.id
       if @review.save
      redirect_to user_path(@user)
    else
      render 'new'
    end
  end

private

    def review_params
      params.require(:review).permit(:rating, :comment, :gigid, :user_id)
    end
end

Server output when clicking link:

Started GET "/users/21/reviews/new?gigid=17&locale=en" for 127.0.0.1 at 2016-01-13 18:08:26 +0100
Processing by ReviewsController#new as HTML
  Parameters: {"gigid"=>"17", "locale"=>"en", "user_id"=>"21"}
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 21]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  Rendered reviews/_form.html.erb (4.9ms)

I then add a comment and a rating and click create. Server output when clicking create:

Started POST "/users/21/reviews?locale=en" for 127.0.0.1 at 2016-01-13 18:10:44 +0100
Processing by ReviewsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"RToZwvodvXxQp1/spEhgemO/oi+4rof8jREuLw27CcEsEBqFWGLeYne1CgH3kvWu9OzAV+bHvOk9g9nq8JMPnw==", "review"=>{"rating"=>"5", "comment"=>"sdfsdfdd"}, "commit"=>"Create Review", "locale"=>"en", "user_id"=>"21"}
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 21]]
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
   (0.1ms)  begin transaction
  SQL (0.7ms)  INSERT INTO "reviews" ("rating", "comment", "user_id", "reviewed_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?)  [["rating", 5], ["comment", "sdfsdfdd"], ["user_id", 21], ["reviewed_id", 1], ["created_at", "2016-01-13 17:10:44.675386"], ["updated_at", "2016-01-13 17:10:44.675386"]]
   (93.6ms)  commit transaction

I notice that 'gigid' is being completely ignored here, but EVERYTHING else saves fine. I don't understand why one attribute saves and the other doesn't, any insight would be greatly appreciated!

Upvotes: 0

Views: 45

Answers (2)

Pavan
Pavan

Reputation: 33542

Your form doesn't have anything for gigid to send it to create action. You can use hidden field in the form like below

<%= simple_form_for([@user, @user.reviews.build]) do |f| %>
  <div id="rating-form">
    <label>Rating</label>
  </div>
  <%= f.input :comment %>
  <%= f.input :gigid, :as => :hidden, :input_html => { :value => params[:gigid] }
  <%= f.button :submit %>
<% end %>

Upvotes: 1

kimrgrey
kimrgrey

Reputation: 562

There is no gigid in review params. Look carefully on your params when you are performing POST: "review"=>{"rating"=>"5", "comment"=>"sdfsdfdd"}. Just review and comment. And after it you are doing:

params.require(:review).permit(:rating, :comment, :gigid, :user_id)

Upvotes: 0

Related Questions