Unpermitted parameter with has_many_and_belongs_to :param, through :param - ruby-on-rails

I am having trouble inputting data into my new model.
I created a new model so I can assign Users to Affiliates.
I have a Users, Affiliates, and UserAffiliates model.
UserAffiliates:
belongs_to :users
belongs_to :affiliates
User:
has_and_belongs_to_many :user_affiliate
has_and_belongs_to_many :affiliate, through: :user_affiliate, optional: true
Affiliate:
has_many :user_affiliates
has_many :users, through: :user_affiliates
How it works, is an affiliate can have many users, but a user will ever only have one affiliate. I then have a commission column within the UserAffiliates table to set the commission based on a user by user basis.
I created this form, and it doesn't seem to be working (which is stemmed from a <% #users.each do |user| %> that goes through each user in a table:
<%= form_for user, remote: true do |f| %>
<% f.fields_for :user_affiliates, remote: true do |f| %>
<%= f.text_field :affiliate_id, class: "form-control" %>
<%= f.submit "Add Affiliate", data: {confirm: "Are you sure?"}, class: "btn btn-light" %>
<% end %>
<% end %>
I get this error:
Parameters: {"utf8"=>"✓", "user"=>{"user_affiliates"=>{"affiliate_id"=>"1"}}, "commit"=>"Add Affiliate", "id"=>"2"}
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
↳ app/controllers/users_controller.rb:58
Completed 500 Internal Server Error in 62ms (ActiveRecord: 6.4ms)
ArgumentError (wrong number of arguments (given 0, expected 1..2)):
app/controllers/users_controller.rb:88:in `[]'
app/controllers/users_controller.rb:88:in `user_params'
app/controllers/users_controller.rb:61:in `block in update'
app/controllers/users_controller.rb:60:in `update'
User controller params:
def user_params
params.require(:user).permit(:name, :approved, :seller, :buyer, :admin, :stripe_account, :email, :password, :password_confirmation, :role, :affiliate_id, :affiliate_ids [], :user_affiliates, :commission)
end
Is my form wrong?
I want to be able to list users in a table as a user.admin, have a text field, and enter an affiliate_id, and then have the user_id and affiliate_id inputted into the UserAffiliate table. I also want to be able to add commission rates that both the user.admin and Affiliate can change.
How can I do this correctly?
Update:
I fixed my params but still have errors:
params:
def user_params
params.require(:user).permit(:name, :approved, :seller, :buyer, :admin, :stripe_account, :email, :password, :password_confirmation, :role, :affiliate_id, :user_affiliates, :affiliate, :commission, affiliate_ids: [])
end
Error:
Started PATCH "/users/2" for 127.0.0.1 at 2019-01-10 21:20:53 -0500
Processing by UsersController#update as JS
Parameters: {"utf8"=>"✓", "user"=>{"user_affiliates"=>{"affiliate_id"=>"1"}}, "commit"=>"Add Affiliate", "id"=>"2"}
User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
↳ app/controllers/users_controller.rb:58
Unpermitted parameter: :user_affiliates
(0.5ms) BEGIN
↳ app/controllers/users_controller.rb:61
(0.1ms) ROLLBACK
↳ app/controllers/users_controller.rb:61
Completed 406 Not Acceptable in 21ms (ActiveRecord: 5.3ms)
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/users_controller.rb:60:in `update'
I tried changing it to user_affiliate (non pluar) and plural in all the controller, model, and form. Is there anything i need to do to my update on the users controller?
User Controller update:
def update
#user = User.find(params[:id])
# #affiliate = current_affiliate
respond_to do |format|
if #user.update(user_params) # <- you'll need to define these somewhere as well
if #user.admin?
format.html { redirect_to '/admin/users', notice: "yahoo" }
format.json { render json: #user }
# elsif #affiliate
# format.html { redirect_to '/a/clients', notice: "yahoo" }
# format.json { render json: #user }
else
format.html { render :edit }
format.json { render json: { errors: #user.errors }, status: :unprocessable_entity }
end
end
end

Related

Retrieving data from nested form

I am trying to re-create a stack overflow like app. One user asks a question, and others can answer. I have a nested form indented on the question's page to get answers from other users.
I am having a difficult time to retrieve the data after the answer is posted, and I have set #answer incorrectly on the questions controller page in the update action, and I can't figure out how to properly retrieve this variable given that the params coming through the questions_controller does not have details of the answer set separately. How do I retrieve the params part related to #answer so that I can set the variable, or maybe I need to use different routes for that?
My form looks like this:
<%= form_for #question do |form| %>
<%=form.fields_for :answer do |answer_form| %>
<div class="form-group">
<%=answer_form.text_area :answer_attributes, placeholder: "Add your answer", rows:10, class:"form-control" %>
<%=answer_form.hidden_field :user_id, value: current_user.id, class:'d-none' %>
<%=answer_form.hidden_field :question_id, value: #question.id %>
</div>
<% end %>
<div>
<%=form.submit 'Post Your Answer', class: 'btn-primary' %>
</div>
<% end %>
My Question model looks like this:
class Question < ApplicationRecord
has_many :answers, dependent: :destroy
belongs_to :user
accepts_nested_attributes_for :answers
validates :headline, presence: true , length: { minimum: 20 }
validates :body, presence: true, length: { minimum: 50 }
validates_associated :answers
end
and the Answer model is:
class Answer < ApplicationRecord
belongs_to :user
belongs_to :question
validates :body, presence: true, length: { minimum: 50 }
end
Questions controller:
class QuestionsController < ApplicationController
before_action :authenticate_user!, except: [:index, :show]
before_action :set_question, except: [:index, :new, :create]
def index
#questions = Question.all.order("id DESC")
end
def show
#question = Question.find(params[:id])
#user = User.find(#question.user_id)
#answers = #question.answers
#answer = Answer.new
end
def new
#question = Question.new
#question.answers.new
end
def create
#question = current_user.questions.new(question_params)
if #question.save
flash[:notice] = "You have successfully posted your question"
redirect_to #question
else
#errors = #question.errors.full_messages
render action: :new
end
end
def edit
set_question
#question = Question.find(params[:id])
end
def update
#question = Question.find(params[:id])
#question.update(question_params)
#answer = #question.answers.new(question_params)
#question.answers.first.user_id = current_user.id
if #question.save
flash[:notice] = "You have sucessfully posted your answer"
redirect_to #question
else
redirect_to new_question_answer_path(#answer), flash: { danger: #question.errors.full_messages.join(",")}
end
end
private
def set_question
#question = Question.find(params[:id])
end
def question_params
params.require(:question).permit(:headline, :body, :user_id, :answer, answers_attributes:[:body, :user_id, :question_id])
end
end
Answers controller:
class AnswersController < ApplicationController
before_action :find_question
def index
#answers = #question.answers
#user = User.find(#question.user_id)
end
def show
#answer = Answer.find(params[:id])
#user = User.find(#question.user_id)
end
def new
#answer = Answer.new(:question_id => #question.id)
end
def create
#answer = Answer.new(answer_params)
if #answer.save
flash[:notice] = "You have sucessfully created the answer."
redirect_to(answers_path(#answer, :question_id => #question.id))
else
flash[:alert] = "Failed to save the answer."
#errors = #answer.errors.full_messages
render :new
end
end
def edit
#answer = Answer.find(params[:id])
end
def update
#answer = Answer.find(params[:id])
if #answer.update_attributes(answer_params)
flash[:notice] = "You have sucessfully updated the answer."
redirect_to(answer_path(#answer, :question_id => #question.id))
else
render :edit
end
end
def delete
#answer = Asnwer.find(params[:id])
end
def destroy
#answer = Answer.find(params[:id])
#answer.destroy
flash[:notice] = "Answer was destroyed"
redirect_to(answers_path)
end
private
def answer_params
params.require(:answer).permit(:body, :user_id, :question_id)
end
def find_question
#question = Question.find(params[:question_id])
end
end
My routes file looks like this:
Rails.application.routes.draw do
get 'questions/index'
root to: 'questions#index'
resources :questions do
resources :answers
end
devise_for :users
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
UPDATE: here are the logs from the moment the server was started and the index page displayed to the moment where I go to the questions page and log the answer
rails server
=> Booting Puma
=> Rails 5.2.2 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.6.0-p0), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
Started GET "/questions/11/answers" for 127.0.0.1 at 2019-03-07 16:10:13 +0600
(1.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
↳ /Users/irina/.rvm/gems/ruby-2.6.0/gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:98
Processing by AnswersController#index as HTML
Parameters: {"question_id"=>"11"}
Question Load (0.8ms) SELECT "questions".* FROM "questions" WHERE "questions"."id" = $1 LIMIT $2 [["id", 11], ["LIMIT", 1]]
↳ app/controllers/answers_controller.rb:65
User Load (2.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 3], ["LIMIT", 1]]
↳ app/controllers/answers_controller.rb:6
Rendering answers/index.html.erb within layouts/application
Answer Load (0.9ms) SELECT "answers".* FROM "answers" WHERE "answers"."question_id" = $1 [["question_id", 11]]
↳ app/views/answers/index.html.erb:11
User Load (1.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 3], ["LIMIT", 1]]
↳ app/views/answers/_new.html.erb:7
Rendered answers/_new.html.erb (61.7ms)
Rendered answers/index.html.erb within layouts/application (92.7ms)
[Webpacker] Compiling…
Started GET "/questions/11/answers" for 127.0.0.1 at 2019-03-07 16:10:18 +0600
Processing by AnswersController#index as HTML
Parameters: {"question_id"=>"11"}
Question Load (1.4ms) SELECT "questions".* FROM "questions" WHERE "questions"."id" = $1 LIMIT $2 [["id", 11], ["LIMIT", 1]]
↳ app/controllers/answers_controller.rb:65
User Load (1.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 3], ["LIMIT", 1]]
↳ app/controllers/answers_controller.rb:6
Rendering answers/index.html.erb within layouts/application
Answer Load (1.3ms) SELECT "answers".* FROM "answers" WHERE "answers"."question_id" = $1 [["question_id", 11]]
↳ app/views/answers/index.html.erb:11
User Load (1.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 3], ["LIMIT", 1]]
↳ app/views/answers/_new.html.erb:7
Rendered answers/_new.html.erb (9.3ms)
Rendered answers/index.html.erb within layouts/application (18.5ms)
Completed 200 OK in 133ms (Views: 108.3ms | ActiveRecord: 18.4ms)
[Webpacker] Compilation failed:
Hash: 53a953077891e4cef2e8
Version: webpack 3.12.0
Time: 2928ms
Asset Size Chunks Chunk Names
application-c57a289721a93641de38.js 3.1 kB 0 [emitted] application
application-c57a289721a93641de38.js.map 2.49 kB 0 [emitted] application
manifest.json 142 bytes [emitted]
[0] ./app/javascript/packs/application.js 346 bytes {0} [built] [failed] [1 error]
ERROR in ./app/javascript/packs/application.js
Module build failed: SyntaxError: Unexpected token (14:15)
12 | if(window.railsEnv && window.railsEnv === 'development'){
13 | try {
> 14 | render(<App />, reactElement)
| ^
15 | } catch (e) {
16 | render(<RedBox error={e} />, reactElement)
17 | }
Completed 200 OK in 11715ms (Views: 11626.9ms | ActiveRecord: 27.7ms)
Started PATCH "/questions/11" for 127.0.0.1 at 2019-03-07 16:10:41 +0600
Processing by QuestionsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"q7HQt4uGPwBIIz0icswfJLWMRk6MiopIfWu9JBcjkuX1VpGBdwlwZu903NDuebSaX8Y90VHnvcEoaV8unV2zkw==", "question"=>{"answer"=>{"answer_attributes"=>"This is the test answer to see how the information goes through", "user_id"=>"3", "question_id"=>"11"}}, "commit"=>"Post Your Answer", "id"=>"11"}
User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 3], ["LIMIT", 1]]
↳ /Users/irina/.rvm/gems/ruby-2.6.0/gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:98
Question Load (0.5ms) SELECT "questions".* FROM "questions" WHERE "questions"."id" = $1 LIMIT $2 [["id", 11], ["LIMIT", 1]]
↳ app/controllers/questions_controller.rb:55
CACHE Question Load (0.0ms) SELECT "questions".* FROM "questions" WHERE "questions"."id" = $1 LIMIT $2 [["id", 11], ["LIMIT", 1]]
↳ app/controllers/questions_controller.rb:39
Unpermitted parameter: :answer
(0.5ms) BEGIN
↳ app/controllers/questions_controller.rb:40
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 3], ["LIMIT", 1]]
↳ app/controllers/questions_controller.rb:40
Answer Load (0.5ms) SELECT "answers".* FROM "answers" WHERE "answers"."question_id" = $1 [["question_id", 11]]
↳ app/controllers/questions_controller.rb:40
(0.3ms) COMMIT
↳ app/controllers/questions_controller.rb:40
Unpermitted parameter: :answer
(0.3ms) BEGIN
↳ app/controllers/questions_controller.rb:44
CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 3], ["LIMIT", 1]]
↳ app/controllers/questions_controller.rb:44
(0.4ms) ROLLBACK
↳ app/controllers/questions_controller.rb:44
Completed 500 Internal Server Error in 97ms (ActiveRecord: 8.3ms)
ActionController::UrlGenerationError (No route matches {:action=>"new", :controller=>"answers", :question_id=>nil}, missing required keys: [:question_id]):
app/controllers/questions_controller.rb:48:in `update'
UPDATE NO 2. It looks like because of this falsely set #answer the #question does not get saved as intended and the second part of the conditional kicks redirecting to the new_question_answer_path. I tried to update it to edit_question_answer_path and it gives the same error that no route matches.
If I open the answer in Pry I get the following object:
[1] pry(#<QuestionsController>)> #answer
=> #<Answer:0x00007fc3ec823c98
id: nil,
body: nil,
question_id: 11,
user_id: 3,
selected: nil,
created_at: nil,
updated_at: nil>
UPDATE No 3
Looks like changing my routes.rb to
Rails.application.routes.draw do
resources :questions, :has_many => :answers
root to: 'questions#index'
resources :questions do
resources :answers
end
devise_for :users
end
and also changing the form for the answer to this
<h2> Your Answer </h2>
<%= form_for [#question, Answer.new] do |form| %>
<div class="form-group">
<%=form.text_area :body, placeholder: "Add your answer", rows:10, class:"form-control" %><br>
<%=form.hidden_field :user_id, value: current_user.id, class:'d-none' %>
<%=form.hidden_field :question_id, value: #question.id %>
</div>
<div>
<%=form.submit 'Post Your Answer', class: 'btn-primary' %>
</div>
<% end %>
did the trick and helped to fix the problem. I am not sure if this is a perfect fix though)
Looks like changing my routes.rb to
Rails.application.routes.draw do
resources :questions, :has_many => :answers
root to: 'questions#index'
resources :questions do
resources :answers
end
devise_for :users
end
and also changing the form for the answer to this
<%= form_for [#question, Answer.new] do |form| %>
<div class="form-group">
<%=form.text_area :body, placeholder: "Add your answer", rows:10,
class:"form-control" %><br>
<%=form.hidden_field :user_id, value: current_user.id, class:'d-none' %>
<%=form.hidden_field :question_id, value: #question.id %>
</div>
<div>
<%=form.submit 'Post Your Answer', class: 'btn-primary' %>
</div>
<% end %>
did the trick and helped to fix the problem. I am not sure if this is a perfect fix though)

ActiveModel ForbiddenAttributesError

Help me please. Rails swear...
What should I change? I allowed all parameters (permit_params), but this does not help:
ActiveModel::ForbiddenAttributesError
Extracted source (around line #17):
#user = User.where(id: params[:id]).first_or_create
#user.superadmin = params[:user][:superadmin]
#user.attributes = params[:user].delete_if do |k, v|
(k == "superadmin") ||
(["password", "password_confirmation"].include?(k) && v.empty? && !#user.new_record?)
end
"config.action_controller.permit_all_parameters = true" solves the problem. But I do not want to disable strong_parameters.
UPDATE
app/admin/user.rb
ActiveAdmin.register User do
form do |f|
f.inputs "User Details" do
f.input :email
f.input :password
f.input :password_confirmation
f.input :superadmin, :label => "Super Administrator"
end
f.actions
end
create_or_edit = Proc.new {
#user = User.where(id: params[:id]).first_or_create
#user.superadmin = params[:user][:superadmin]
#user.attributes = params[:user].delete_if do |k, v|
(k == "superadmin") ||
(["password", "password_confirmation"].include?(k) && v.empty? && !#user.new_record?)
end
if #user.save
redirect_to :action => :show, :id => #user.id
else
render active_admin_template((#user.new_record? ? 'new' : 'edit') + '.html.erb')
end
}
member_action :create, :method => :post, &create_or_edit
member_action :update, :method => :put, &create_or_edit
permit_params :authenticity_token, :commit, :id, user: [:email, :password, :password_confirmation, :superadmin]
end
P.S. I worked on this guide.
The problem is very similar to this problem: I get ActiveModel::ForbiddenAttributesError with Active Admin and Devise I get this error when I create a new user in the administration panel ActiveAdmin.
UPDATE1
console
Started POST "/admin/users" for 127.0.0.1 at 2017-12-08 22:57:04 +0300
Processing by Admin::UsersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"***********", "user"=>{"email"=>"test#test.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "superadmin"=>"0"}, "commit"=>"Create User"}
User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]]
User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL ORDER BY "users"."id" ASC LIMIT $1 [["LIMIT", 1]]
(3.0ms) BEGIN
(0.4ms) ROLLBACK
Completed 500 Internal Server Error in 24ms (ActiveRecord: 5.2ms)
ActiveModel::ForbiddenAttributesError
ActiveModel::ForbiddenAttributesError):
app/admin/user.rb:17:in `block (2 levels) in <top (required)>'
I have to agree with the answer given to the question you referenced, per the doc please try:
permit_params :email, :password, :password_confirmation, :superadmin

Displaying form validation errors in rails 5

I am having some difficulty getting my nested rails form to display validation errors in the view
Controller:
class RentersController < ApplicationController
before_action :set_renter, only: [:show, :edit, :update, :destroy]
before_action :get_rental
def get_rental
#rental = Rental.find(params[:rental_id])
end
...
# GET /renters/new
def new
#renter = Renter.new
end
...
def create
#renter = #rental.renters.new(renter_params)
respond_to do |format|
if #renter.save
format.html { redirect_to rental_renters_path(#rental), notice: 'Renters were successfully created.' }
format.json { render :show, status: :created, location: #renter }
else
puts #renter.errors.full_messages
format.html { render :new }
format.json { render json: #renter.errors, status: :unprocessable_entity }
end
end
end
...
end
Model
class Renter < ApplicationRecord
belongs_to :rental
validates :name, presence: { message: "..." }
validates :height, presence: { message: "..." }
validates :weight, presence: { message: "..." }
validates :shoeSize, presence: { message: "..." }
end
_form partial being rendered in View
<div class="rental-forms-container sixteen wide column">
<%= form_for([#rental, #renter], remote: true, :html => { class: "renter-form ui form", id: "base-form" }) do |f| %>
<div class="fields">
...
</div>
<% end %>
</div>
<div class="ui warning message">
...
<ul class="list">
<% #renter.errors.messages.values.each do |message| %>
<% message.each do |m| %>
<li><%= m %></li>
<% end %>
<% end %>
</ul>
</div>
...
<%= link_to 'continue with booking', rental_renters_path, remote: true, class: 'ui teal submit button', id: 'submitRenterForms' %>
</div>
Console
Processing by RentersController#create as JS
Processing by RentersController#index as JS
Parameters: {"utf8"=>"✓", "renter"=>{"name"=>"", "height"=>"", "weight"=>"", "wetsuit_style"=>"Adult Womens", "shoeSize"=>"", "rental_id"=>""}, "rental_id"=>"109"}
Parameters: {"rental_id"=>"109"}
Rental Load (0.3ms) SELECT "rentals".* FROM "rentals" WHERE "rentals"."id" = $1 LIMIT $2 [["id", 109], ["LIMIT", 1]]
Rental Load (5.5ms) SELECT "rentals".* FROM "rentals" WHERE "rentals"."id" = $1 LIMIT $2 [["id", 109], ["LIMIT", 1]]
(0.2ms) BEGIN
(0.1ms) ROLLBACK
Name Let us know the name of each renter so we can customize your experience
Height Let us know the height of each renter so we can properly size your wetsuits
Weight Let us know the weight of each renter so we can properly size your wetsuits
Shoesize Let us know the shoe size of each renter so everyone gets the right surf booties
Rendering renters/new.html.erb within layouts/application
Rendered renters/_form.html.erb (2.4ms)
Rendered renters/new.html.erb within layouts/application (3.7ms)
Rendered shared/_following_menu.html.erb (0.1ms)
Rendered shared/_sidebar_menu.html.erb (0.1ms)
Rendered shared/_menu.html.erb (0.8ms)
Rendered shared/_footer.html.erb (0.5ms)
Completed 200 OK in 106ms (Views: 73.8ms | ActiveRecord: 14.0ms)
(0.6ms) SELECT COUNT(*) FROM "renters" WHERE "renters"."rental_id" = $1 [["rental_id", 109]]
Rendering renters/index.html.erb within layouts/application
Charge Load (0.3ms) SELECT "charges".* FROM "charges" WHERE "charges"."rental_id" = $1 LIMIT $2 [["rental_id", 109], ["LIMIT", 1]]
Rendered rentals/_info.html.erb (11.0ms)
Renter Load (0.3ms) SELECT "renters".* FROM "renters" WHERE "renters"."rental_id" = $1 [["rental_id", 109]]
Rendered charges/_form.html.erb (1.9ms)
Rendered renters/index.html.erb within layouts/application (37.5ms)
Rendered shared/_following_menu.html.erb (0.6ms)
Rendered shared/_sidebar_menu.html.erb (0.5ms)
Rendered shared/_menu.html.erb (1.2ms)
Rendered shared/_footer.html.erb (1.4ms)
Completed 200 OK in 265ms (Views: 134.5ms | ActiveRecord: 9.5ms)
The validation errors are outputting to the terminal but they are not appearing in the view.
I have tried using the flash and session hashes to pass them to the view but to no avail. Any guidance would be greatly appreciated.
When using form_for (or if you're now using form_with) pay attention to whether remote or local is set to true. Local uses the browser's normal submission mechanism, while remote uses Ajax. When using remote (as indicated above), the page will not render in the "normal" fashion, as expected.
The Rails documentation has more details: http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html

RoR; Object expected got string

I found several topics related , but couldn't figure out how to solve this problem,
This is my code
<%= f.label :projeto %><br>
<%= f.collection_select :projeto, Projeto.order(:id), :id, :name, include_blank: true %>
model => task belongs_to projeto and projeto has_many tasks
Full Error:
ActiveRecord::AssociationTypeMismatch at /tasks/1
Projeto(#69996814678740) expected, got String(#69996762580840)
Database is set to t.references.
Task_controller
def update
respond_to do |format|
if #task.update(task_params)
format.html { redirect_to #task, notice: 'Task was successfully updated.' }
format.json { render :show, status: :ok, location: #task }
else
format.html { render :edit }
format.json { render json: #task.errors, status: :unprocessable_entity }
end
end
end
def task_params
params.require(:task).permit(:seq, :descr, :seqpai, :typo, :hour, :projeto)
end
Started PATCH "/tasks/1" for 127.0.0.1 at 2015-06-18 14:30:23 -0300
Processing by TasksController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Is7YTC0v5OONEEsIgOvmI+CEuVYG/WsoKWzskGippD2eOwthKVHb2dI+S19GkkI9aU0IwTrzwERlLq2ybWbGxw==", "task"=>{"seq"=>"0", "descr"=>"Projeto", "seqpai"=>"", "typo"=>"Analitica", "hour"=>"12", "projeto"=>"1"}, "commit"=>"Update Task", "id"=>"1"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]]
Task Load (0.2ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = ? LIMIT 1 [["id", 1]]
(0.2ms) begin transaction
(0.1ms) rollback transaction
Completed 500 Internal Server Error in 25ms (ActiveRecord: 0.8ms)
Normally this is caused by assigning a string to something expecting a model association. For example:
# Not allowed, `project=` expects a Project model
#task.project = params[:project_id]
# Converts parameter into model, but may throw exception
#task.project = Project.find(params[:project_id])
# Direct assignment, requires validation on model level
#task.project_id = params[:project_id]
I changed the View for
<%= f.label :projeto_id %>
and permited in controller projeto_id
Then worked Fine,
Thanks everyone for the hint.

Custom devise update form not saving changes

I have a custom Devise form that I want to update my devise user with. But the from is not saving the changes.
Form:
.small-12.columns
.well
=form_tag(test_registration_path, method: 'PUT', id: "my-awesome-dropzone.dropzone") do
.row
.small-4.columns
%input#photo-dropzone{:name => "file", :type => "file"}/
.small-8.columns
.row
.small-12.columns
= label_tag :name
= text_field_tag :name
= submit_tag "Submit", class: "button button-green"
Log:
Started PUT "/tests" for 127.0.0.1 at 2014-10-06 11:48:04 -0700
Processing by Tests::Devise::RegistrationsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"0R7keMt16tsIdjawQHE7yq15Ye6V/w5I4klAvs1WWLY=", "name"=>"testt", "commit"=>"Submit"}
Artist Load (0.4ms) SELECT "artists".* FROM "artists" WHERE "artists"."id" = 19 ORDER BY "artists"."id" ASC LIMIT 1
Artist Load (0.2ms) SELECT "artists".* FROM "artists" WHERE "artists"."id" = $1 LIMIT 1 [["id", 19]]
(0.1ms) BEGIN
(0.1ms) COMMIT
Redirected to http://site.dev/artists/19
Completed 302 Found in 5ms (ActiveRecord: 0.8ms)
RegistrationsController#Update
def update
# For Rails 4
account_update_params = devise_parameter_sanitizer.sanitize(:account_update)
# For Rails 3
# account_update_params = params[:user]
# required for settings form to submit when password is left blank
if account_update_params[:password].blank?
account_update_params.delete("password")
account_update_params.delete("password_confirmation")
end
#user = Test.find(current_test.id)
if #user.update_attributes(account_update_params)
set_flash_message :notice, :updated
# Sign in the user bypassing validation in case their password changed
sign_in #user, :bypass => true
redirect_to artist_path(#user)
else
render "edit"
end
end
What do I have to do to properly update my params?
Did you point devise to your custom controller?
https://github.com/plataformatec/devise/wiki/How-To:-Customize-routes-to-user-registration-pages

Resources