__ "I want to get the name from the ActiveHash model, but I get an undefined error and can't get it ..." __
For such people, I will explain how to get the ActiveHash name forcibly and why you can not get the name in the first place.
If you are new to programming, we would appreciate it if you could refer to it. (For those of you who know why you get an error, this article is useless. I'm sorry.)
・ Review how to get normal values using ActiveHash -Learn how to get the value from the ActiveHash model with the find method · Understand why undefind errors occur
sushi.rb
class Sushi < ActiveHash::Base
self.data = [
{ id: 1, name: 'fatty tuna' },
{ id: 2, name: 'Medium Toro' },
{ id: 3, name: 'How much' },
{ id: 4, name: 'conger eel' },
{ id: 5, name: 'Engawa' },
{ id: 6, name: 'sea urchin' },
{ id: 7, name: 'The squid' }
]
end
rhtml:lunch.html.erb
<%= @shari.sushi.name %>
<!--@ Shari sushi_If id is "4", "Conger eel" is displayed-->
With such a description, you can get the value of name associated with @ shari.sushi_id from the ActiveHash model. (The description of the model is omitted this time.)
However, under certain conditions __, the name element of ActiveHash cannot be obtained.
undefined method '〇〇' for …
In some cases, an error will occur.
In such a case, I will tell you how to forcibly get the value from the ActiveHash model.
rhtml:lunch.html.erb
<%= Sushi.find(@shari.neta_id).name %>
"I got an error, but I want to write an Active Hash model and use it ..."
The recommended method is to use the __find method to forcibly get __.
(1) Pass the id you want to get to the argument of the find method and search for @ shari.neta_id from the Sushi model (ActiveHash). (2) I want the name of the acquired id, so I will add .name at the end. ③ From the Sushi model, you can get the name element that matches @ shari.neta_id.
It's a bit brute force, but you can use this method to get the specified name element. However, be careful when using it, as the code tends to be verbose.
rhtml:new.html.erb
<%= form.select :neta_id,[["Horse mackerel",1],["Kohada",2],["Redthroat seaperch",3],["Tilefish",4]] %>
rhtml:lunch.html.erb
<% case @shari.neta_id %>
<% when 1 then %>
<p>Horse mackerel</p>
<% when 2 then %>
<p>Kohada</p>
<% when 3 then %>
<p>Redthroat seaperch</p>
<% when 4 then %>
<p>Tilefish</p>
<% end %>
"The amount of description is small, and it doesn't have to be ActiveHash ..."
For those who say, by describing the pull-down part in form.select and the display part in the case statement, you can create a pseudo ActiveHash-like expression.
However, this method is recommended to be used only when there are few choices, as the number of choices increases and the amount of description becomes huge, which may reduce the readability of the code.
In conclusion, if __ "The model name of the ActiveHash model and the column name do not match" __, the name element cannot be obtained in the canonical way.
If the column name is sushi_id (integer type), the ActiveHash model name must also be Sushi.rb. In case of (1) above, even if you try to get the value from Sushi.rb in the form of neta.name, you cannot get it.
When creating an ActiveHash model to create pull-downs and checkboxes, make sure the model name and column name are the same.
(1) ActiveHash cannot get the name element with .name unless the model name and column name are present. (2) If you want to get the value from the model of another name, you can get the name element by using find. (3) If the description itself (choice) is small, there is also a method of expressing it by using form.select and when.
Thank you for watching until the end. Let's continue to study hard!
Recommended Posts