Strong Params Unpermitted parameters - ruby

I know there are alot of questions on this, but after looking at about a dozen or so none of them appear to be the same problem. I have an "Action" model that I am just simply trying to edit and update. (fyi, this isn't a nested form, I'm not using devise, and this isn't an activeadmin problem...like virtually all other questions about this topic are). I'm getting
error:
unpermitted parameters: utf8, _method, authenticity_token when I do this.
Action params in Actions_controller:
def action_params
params.permit(:id, :call_answered, :is_customer, :category_id, :actiontype_id, :why, :reviewer_id, :reviewed, :spam, :lead)
end
IF I change it to:
params.require(:action).permit(:id, :call_answered, :is_customer, :category_id, :actiontype_id, :why, :reviewer_id, :reviewed, :spam, :lead)
end
than I get the below error (and I can't find any solution for this):
undefined method `permit' for "update":String
Actions Controller:
def edit
#action = Action.find(params[:id])
#actiontypes = Actiontype.all
#categories = Category.all
#lead_categories = #categories.where(lead: true)
#user = current_user
#reviewer = User.find(#action.reviewer_id) if #action.reviewed?
end
def update
#action = Action.find(params[:id])
if #action.update!(action_params)
binding.pry
flash[:success] = "Loop closed!"
redirect_to '/closingloop/actions?reviewed=false'
else
flash[:danger] = "Something Went Wrong! The loop was not closed!"
render :edit
end
end
def action_params
params.permit(:id, :call_answered, :is_customer, :category_id, :actiontype_id, :why, :reviewer_id, :reviewed, :spam, :lead)
end
View:
<%= form_for [:closingloop, #action] do |f| %>
<%= f.hidden_field :reviewer_id, :value => #user.id %>
<%= f.hidden_field :reviewed, :value => true %>
<table width="70%" align="center" class="table table-responsive">
<tr>
<th>Tracking Number</th>
<td><%= #action.company.tracking_phone_number %></td>
</tr>
<tr>
<th>Target Number</th>
<td><%= #action.company.phonenumber %></td>
</tr>
<tr>
<th>Opportunity Name</th>
<td><%= #action.opportunity_name %></td>
</tr>
<tr>
<th>Opportunity Address</th>
<td><%= #action.customer_address %></td>
</tr>
<tr>
<th>Opportunity Phone</th>
<td><%= #action.caller_phone_number %></td>
</tr>
<tr>
<th>Call Recording</th>
<td><%= audio_tag(#action.call_recording_link, controls: true) %></td>
</tr>
<tr>
<th>Duration</th>
<td><%= #action.duration %></td>
</tr>
<tr>
<th>Call Status</th>
<td><%= #action.call_status %></td>
</tr>
<tr>
<th>Date & Time</th>
<td><%= #action.created_at.to_formatted_s(:long) %></td>
</tr>
<% if #action.reviewed? %>
<tr id="row_reviewed_by">
<th>Reviewed By</th>
<td><%= #reviewer.first_name %> <%= #reviewer.last_name %></td>
</tr>
<% end %>
<tr><td colspan="2"> </td></tr>
<tr id="q_call_answered">
<th>Call Answered?</th>
<td>
<div class="radio-toolbar">
<%= f.radio_button :call_answered, true, class: 'call_answered_true' %>
<%= f.label :call_answered, "Yes" %>
<%= f.radio_button :call_answered, false, class: 'call_answered_false' %>
<%= f.label :call_answered, "No" %>
</div>
</td>
</tr>
<tr id="why_not_answered" style="display:none;">
<th>Why wasn't it answered?</th>
<td>
<%= f.select :why, options_for_select([["No Answer", "N"], ["Abandoned", "A"], ["After Business Hours", "H"]], #action.why), { include_blank: true } %>
</td>
</tr>
<tr id="q_opportunity" style="display:none;">
<th>Was it a opportunity?</th>
<td>
<div class="radio-toolbar">
<%= f.radio_button :is_customer, true, class: 'opportunity_true' %>
<%= f.label :is_customer, "Yes" %>
<%= f.radio_button :is_customer, false, class: 'opportunity_false' %>
<%= f.label :is_customer, "No" %>
</div>
</td>
</tr>
<tr id="opportunity_type" style="display:none;">
<th>Opportunity Type</th>
<td>
<%= f.select :actiontype_id, options_from_collection_for_select(#actiontypes, 'id', 'action_type', #action.actiontype_id), { include_blank: true } %>
</td>
</tr>
<tr id="reason_for_call" style="display:none;">
<th>Reason for Call</th>
<td><%= f.select :category_id, options_from_collection_for_select(#categories, 'id', 'reason', #action.category_id), { include_blank: true } %></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" value="Save" id="save" class="btn btn-success" /></td>
</tr>
</table>
<% end %>

The main problem here is that if you have model named 'action', your params by default will be named in the same way, which collides with ActionController default params. The simplest solution is, I guess, renaming your model.

Related

how to disable checkbox on condition?

I am trying to create a spreadsheet on index page to display items with checkbox and if validated - the checkbox will be disabled so that people won't mis-ticked it.I was wondering should i do it with controller or the view? thanks : can you help?
In app/views/scooties_coupons/index.html.erb
<table class="table table-hover">
<h1>Scooties Coupons</h1>
<%= form_with(url: validate_coupons_path, method: 'patch') do |f| %>
<table>
<thead>
<tr>
<th>Valid</th>
<th>Coupon</th>
<th>Redeemed</th>
<th>First name</th>
<th>Surname</th>
<th>email</th>
<th>occupation</th>
<th>validation</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% #scooties_coupons.each do |scooties_coupon| %>
<tr>
<td>
<%= fields_for('scooties_coupons[]', scooties_coupon) do |cf|
cf.check_box(:validated)
end %>
</td>
<td><%= scooties_coupon.coupon %></td>
<td><%= scooties_coupon.redeemed %></td>
<td><%= scooties_coupon.first_name %></td>
<td><%= scooties_coupon.surname %></td>
<td><%= scooties_coupon.email %></td>
<td><%= scooties_coupon.occupation %></td>
</tr>
<% end %>
</tbody>
</table>
<%= f.submit %>
<% end %>
<br>
</table>
in app/controllers/scotties_coupons_controller.rb:
def set_valid_coupons
to_valid = params[:scooties_coupons].select do |id, attrs|
attrs[:validated] == '1'
end
to_not_valid = params[:scooties_coupons].reject do |id, attrs|
attrs[:validated] == '1'
end
ScootiesCoupon.transaction do
ScootiesCoupon.where(id: to_valid.keys, validated: false).update_all(
validated:true)
ScootiesCoupon.where(id: to_not_valid.keys, validated: true).update_all(
validated:false)
end
redirect_to action: :index, notice: 'Validations updated'
end
you can do something like
<table class="table table-hover">
<h1>Scooties Coupons</h1>
<%= form_with(url: validate_coupons_path, method: 'patch') do |f| %>
<table>
<thead>
<tr>
<th>Valid</th>
<th>Coupon</th>
<th>Redeemed</th>
<th>First name</th>
<th>Surname</th>
<th>email</th>
<th>occupation</th>
<th>validation</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% #scooties_coupons.each do |scooties_coupon| %>
<tr>
<td>
<% if true %>
SOMETHING HERE
<% else %>
<%= fields_for('scooties_coupons[]', scooties_coupon) do |cf|
cf.check_box(:validated)
end %>
<% end %>
</td>
<td><%= scooties_coupon.coupon %></td>
<td><%= scooties_coupon.redeemed %></td>
<td><%= scooties_coupon.first_name %></td>
<td><%= scooties_coupon.surname %></td>
<td><%= scooties_coupon.email %></td>
<td><%= scooties_coupon.occupation %></td>
</tr>
<% end %>
</tbody>
</table>
<%= f.submit %>
<% end %>
<br>
</table>

How to use sort_link with model instance method in rails 4 with Ransack Gem?

I have used Ransack Gem,Rails 4.
roles_controllers.rb
def index
#q = Role.ransack(params[:q])
#roles = #q.result(distinct: true)
end
This is instance method in model(role.rb)
def user_count
self.users.count
end
This is my html table header(Roles/index.html.erb)
<table class="table table-bordered table-framed rb-usr-tbl">
<thead>
<tr>
<th><%= sort_link(#q, :name) %></th>
<th>Description</th>
<th><%= sort_link(#q,:role_users_user_count) %></th>
<th colspan="2">Actions</th>
</tr>
</thead>
<tbody class="role-index">
<% #roles.each do |role| %>
<tr>
<td><%= role.human_role %></td>
<td><%= role.description %></td>
<td><%= role.user_count %></td>
<td>
<%= link_to edit_role_path(role), :remote => true,:title => "Edit Role" do %>
<i class="icon-pencil7 rb-pencil"></i>
<% end %>
</td>
<td>
<%= link_to role, method: :delete,:title => "Delete Role", data: { confirm: 'Are you sure?' } do %>
<i class="icon-trash rb-trash"></i>
<% end %>
</td>
</tr>
<% end %>
</tbody>
</table>
There is relationship between user and role are One role has_many users.
Here i want to sort this count of users in asc and desc order but with this code it does not work.
Help me if you can.
Thanks
Ransack is very smart itself, try to change line
<th><%= sort_link(#q,:role_users_user_count) %></th>
to
<th><%= sort_link(#q, :users_count) %></th>
Explanation: In the variable #q you keep a Ransack query object on the model Role, if you call sort_link on #q it will apply users_count as "join users relation and order by users count".

Search value by ajax call using Rails 3

I want to fetch data by ajax call using Rails 3.I have a form which is given below.
views/users/new.html.erb
<%= form_for :user ,:url => {:action => "search" } do |f| %>
<div class="input-group bmargindiv1 col-md-12"> <span class="input-group-addon text-left">Receipt No. Scan :</span>
<%= f.text_field :user_no,:class => "form-control",placeholder:"user number" %>
</div>
<% end %>
This form says when user will type user_no and as soon as number will typed the search action will execute.A table should present below of this form to show other data by matching according to that user_no.That table is given below.
<table>
<tr>
<th>User Name</th>
<th>User Email</th>
<th>User Number</th>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</table>
This table will be hide initially.Once search will complete it will be display with appropriate data.
The below is my controller page.
controller/users_controller.rb
class UsersController < ApplicationController
def new
#user=User.new
end
def search
end
end
All the data(i.e-user no,name and email) already saved in DB.Please help me to complete this task using Rails Ajax and Data should display without reloading the page after form submit.I am using Rails version 3.2.19.
If I understand you correctly then try something like that:
In controller:
def search
#user = User.find_by_user_no(params[:user_no])
end
In view with form:
<%= form_for :user ,:url => {:action => "search" }, remote: true do |f| %>
<div class="input-group bmargindiv1 col-md-12"> <span class="input-group-addon text-left">Receipt No. Scan :</span>
<%= f.text_field :user_no,:class => "form-control",placeholder:"user number" %>
</div>
<% end %>
remote: true means that request will be asynchronous.
In view with table:
<div id="search-output-table">
<%= render partial: "search_output_table", locales: {user: #user} %>
</div>
In app/views/users/_search.js.erb:
$("#search-output-table").html("<%= escape_javascript( render(partial: "search_output_table") ) %>");
In app/views/users/_search_output_table.html.erb:
<table>
<tr>
<th>User Name</th>
<th>User Email</th>
<th>User Number</th>
</tr>
<tr>
<td><%= user.name %></td>
<td><%= user.email %></td>
<td><%= user.number %></td>
</tr>
</table>

Rails 3 - Partial Not Rendering

In my view I have the following:
<div class="subject edit">
<%= form_for(:subject, :url => {:action => 'update', :id => #subject.id}) do |f| %>
<%= render(:partial => "form", :locals => {:f => f}) %>
<div class="form-buttons">
<%= submit_tag("Update Subject") %>
</div>
<% end %>
In the same folder I have created a partial (_form.html.erb). But for some reason it is not rendered.
_form.html.erb:
<table summary="Subject form fields">
<tr>
<th>Name</th>
<td><%= f.text_field(:name) %></td>
</tr>
<tr>
<th>Position</th>
<td><%= f.text_field(:position) %></td>
</tr>
<tr>
<th>Visible?</th>
<td><%= f.text_field(:visible) %></td>
</tr>
I'm running rails 3.2.7. Can some see what I'm doing wrong?
Thanks!
A server reset fixed the issue. Doh!

How to work with string?

I have a string with emails (name, surname, email):
#emails = "Nina Beeu luda#hotmail.com, Vasilina Korute valaj#kos.co.uk, Hikote Ewefs valaj#kos.co.uk,
Egert Erm papa#sasee.ee, Sambuka Ioas valaj#kprivet.com, Vanish Kiki sasa#sas.com, Inoke Xxx saop#hot.ee"
I need to substring from this string: name, surname and email and paste them into table:
<table border=1>
<tr>
<td>
Name
</td>
<td>
Surname
</td>
<td>
Email
</td>
</tr>
</table>
How i can do it?
<table>
<% #emails.split(", ").each do |chunk| %>
<tr>
<% ["Name", "Surname", "Email"].zip(chunk.split(" ")).each do |data| %>
<td><%= data.join(": ")</td>
<% end %>
</tr>
<% end %>
</table>
#emails.split(/,\s+/).each do |details|
name, surname, email = details.split(" ")
# do your html creaty thing here
end
More explicitly, you could do this in erb:
<table border=1>
<% #emails.split(/,\s+/).each do |details| %>
<% name, surname, email = details.split(/\s+/) %>
<tr>
<td><%= name %></td>
<td><%= surname %></td>
<td><%= email %></td>
</tr>
<% end %>
</table>
And a variant in haml:
%table(border=1)
- #emails.split(/,\s+/).each do |details|
%tr
- details.split(/\s+/) do |detail|
%td= detail

Resources