passing parameters between views and controllers ruby 1.8.7 - ruby-on-rails-3

i have this form nested in view 'A'
<div>
<%if current_user%>
<%=form_for(ModelB.new) do |f|%>
<%if (params[:param_to_check].present?)%>
<%f.hidden_field "param1",:value=> #modelA.id%>
<%f.hidden_field "param2",:value=> current_user.id%>
<%end%>
render button
<%end%>
<%else%>
render other butotn
<%end%>
</div>
and this 'find' in Bs_controller:
#modelA=ModelA.find_by_id(params[:param1])
:option_from_specific_gem=> -(#modelA.wanted_value).abs
when i look to the params passed to the Bs_controller i see:
Parameters: {"authenticity_token"=>"some_hash=", "utf8"=>"✓", "y"=>"42", "x"=>"144"}
and i need to pass the hidden_field's valies to Bs_controller.
thx for the atention :)
here is the gist: https://gist.github.com/rmatuoka/dd6904809cf89cf916f7

I made some comments, I'm gonna go ahead and make them into an answer.
There are 3 possible things. Assuming it's not a typo, you aren't currently outputting the hidden fields to the HTML. You need to us <%= %> to output the result.
<%= f.hidden_field "param1",:value=> #modelA.id %>
<%= f.hidden_field "param2",:value=> current_user.id %>
This is likely the issue. Otherwise I'd guess either current_user or params[:param_to_check] is nil.

Add param1 and param2 to your list of permitted parameters. In your controller, you should have something like:
def modela_params
params.require(:modela).permit(:x, :y, :param1, :param2)
end

Related

I want to change default label YES NO of my checkbox radio_button from my f.input (form_for)

I'm starting using Rails.
In my form_for, I want to change label of default value YES / NO (which appear in my front view)
<div class="row">
<div class="col-sm-6">
<%= f.input :experience,
as: :radio_buttons,
label:"A t-il déjà saillie ?" %>
</div>
</div>
Which option should I add to change label ?
How can I display option in one line ?
Thank you for your help
Are you using simple_form_for? I think so from as: :radio_buttons. If you are, try:
<%= f.input :experience, as: :radio_buttons, collection: [['0', 'false'], ['1', 'true']], label_method: :second, value_method: :first %>
You can probably infer the logic from that line. Make an array of arrays for your collection, each sub array containing first the value of the radio button, and then the label.

Rails dropdown/select location objects with individual params

My scenario is on the home page I want to click a dropdown toggle/select. In that toggle I want it to display a list of Location objects. However I want to pass individual params that are different in each one. My goal is to use a dropdown to toggle location information in the view. The problem is right now I'm hard coding locations into this drop down. But I am creating Location objects on a different page. I want those Location objects to populate the dropdown on the home page, but allow the user's choice to pass params to change the view. This would allow an unlimited number of locations. What is a good way to accomplish this.
index.html.erb
**I erased the dropdown code to simplify things.**
<li><%= link_to "#{#location1}", {:location1 => "location1"}%></li>
<li><%= link_to "#{#location2}", {:location2=> "location2"}%></li>
home_controller.rb
if params[:location1]
#current_location = Location.last
#myreviews = Review.where("location_id = ?", #current_location.id).order('created_at asc')
end
if params[:location2]
#current_location = Location.first
#myreviews = Review.where("location_id = ?", #current_location.id).order('created_at asc')
end
SOLUTION
Here is what I did to solve the problem in the end.
View
<ul class="dropdown-menu loc-drop scrollable-menu" role="menu" aria-labelledby="menu1">
<% #locations.each do |u| %>
<li><%= link_to u.name, :params => {:loc => u.id} %></li>
<% end %>
</ul>
</ul>
Controller
#locations = Location.all
if params[:loc]
#chosen_location = Location.where('id = ?', params[:loc]).pluck(:id).first
end
At that point I'm using #chosen_location to display details like name and address.

Display only one field from an embedded document with MongoID

I'm a real beginner with MongoDB and MongoID.
I created two scaffolds
class Objet
include Mongoid::Document
field :nom, type: String
embeds_one :coordonnee
end
And
class Coordonnee
include Mongoid::Document
field :adresse1, type: String
field :adresse2, type: String
field :code_postal, type: String
field :ville, type: String
embedded_in :objet
end
That's what I get when creating a new Objet :
Now, I'm trying to show only the field adresse1 for this document, but it doesn't work. I can display only the whole embedded document doing this :
When I do :
<%= #objet.coordonnees.adresse1 %>
I get this error :
undefined method `adresse1' for #<Hash:0x2b2b1f0>
How can I do that ?
EDIT
Doing that, I can display all the elements "Adresse1, adresse2, ville, code_postal" :
Controller
def show
#objet = Objet.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: #objet }
end
end
View
<%= #objet.nom %>
<% #objet.coordonnee.each do |t| %>
<%= t[1] %>
<% end %>
But my question is : How to display ONLY one of them ? Such as ville, or code_postal or adresse1... ?
What was your code that works for the full document? It was dropped from your post.
In the mongo Shell, you could do this with dot notation db.collection.find({},{'coordonnees.adresse1':1,'_id':0}) You need to specify the '_id':0 because _id is always returned by default.
The other answer will not work because adresse1 is a subdocument. You must include the reference to coordonnees.
Not hugely familiar with MongoID, but assuming you can make calls straight to mongo, there is a second implicit parameter to all find-like statements called a projection that specifies what exactly you would like to return.
For instance, showing only adresse1 for all items in your collection:
db.collection.find({},{"coordonnees.adresse1": 1, "_id":0})
should return only the adresse1 parameter. I wasn't quite able to tell exactly what context you're displaying the objects in, but regardless of context, api calls to mongo should be fairly straightforward to make. Let me know if I've misinterpreted this question though.
In your posted example, you should change your find function to something like the following:
Objet.find({params[:id]}, {:fields => [coordonnees.adresse1]})
Hope that helps.
I found the solution to my problem.
To display only one element of the hash, I can do :
<%= #objet.coordonnees['adresse1'] %>
I am not sure if you are using embeds_one or embeds_many as you are using singular and plural forms of the relation name interchangeably in your question.
If it is a embeds_one the problem is that you should not iterate on #objet.coordonnee as it is a single document. Your view code should look like:
<%= #objet.nom %>
<%= #objet.coordonnee.address1 %>
If it is a embeds_many, your relation name should be plural, then you should be able to use t.address1 in your view.
# model Objet
embeds_many :coordonnees
# view
<%= #objet.nom %>
<% #objet.coordonnees.each do |t| %>
<%= t.address1 %>
<% end %>

Rails and named_scope queries

I'm trying to get my head around the concept of named_scoped queries in rails.
I'm trying to filter a table to get only non featured items (:featured => false).
In my model i have added
scope :allgames, where(:featured => false)
and
scope :featured, where(featured => true)
I'm trying to list all featured and non featured items separately on my Game index page.
Is it possible to to it via a named scope.
So far i have:
<% #games.each do |item| %>
<% if item.featured %>
<%= render 'application/item_synopsis_builder', item: item %>
<% end -%>
<% end %>
And I wonder if it is possible to do something like:
<% #games.featured.each do |item| %>
<%= render 'application/item_synopsis_builder', item: item %>
<% end %>
or
<%= render partial: 'application/item_synopsis_builder', collection: #games.featured %>
When I try I get a message saying that there is no method featured.
But when I run the command Game.featured in the console I get the result list of all featured games.
Is it possible to access this list/method in the view?
Named scopes are added to the model as a class method, so trying to access the method on a collection of objects won't work. Similar functionality can be achieved with:
#games.where(:featured => true).each do
...
end
But I would recommend having two variables in your controller:
#featured_games = Games.featured
#all_games = Games.allgames
then use those in your views.
Your views are driven by the #games instance variable that is created by the controller that is rendering the views. Named scopes create a class method for subclasses of ActiveRecord::Base. So "Game.featured" returns something because defining the named scope created a method for the Game class. It did not create an instance method that objects of the Game class (such as #games) can invoke. That's why "#games.featured" gives you an error.
To do what you want to do, create two instance variable in the controller and pass them to the view, e.g.
#all_games = Game.allgames
#featured_games = Game.featured
Both variables will be available to your view, and you can construct loops to render each collection however you like.
A scope is a class method (or assimilable to, I don't know the specifics), so yes, Game.featured would work, but when you do #games.featured, you are calling featured on an array of Game instances.

How to add line number in a rails app?

I writting a simple app in that an item can have multiple line items. When you go into the items detail view you can see all the line items that belong to it.
I'd like to add a line number to the line_items, when I'm in the item detail view I'd like to see
line_item_1
line_item_1
line_item_1
I was thinking about an autoincrement columns, but this would start from 1 when I reimport the data. So maybe a virtual column, but how would I calculate what to display?
Any ideas?
Thanks
Thomas
You could do:
<% line_items.each_with_index do |item, index| %>
<%= render :item_partial, :locals => {:item => item, :index => index} %>
<% end %>
item partial:
<%= index %>. <%= item.name %>
If you want to keep the same order every time, just order your line items by creation date.