Je suis en train de faire une application Rails 4.Rails 4 - associations HABTM et l'affichage des attributs en vue associée
J'ai un modèle industries et un modèle de profils.
Ma table Industries:
create_table "industries", force: :cascade do |t|
t.string "sector"
t.string "icon"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "industries_organisations", id: false, force: :cascade do |t|
t.integer "industry_id"
t.integer "organisation_id"
end
add_index "industries_organisations", ["industry_id"], name: "index_industries_organisations_on_industry_id", using: :btree
add_index "industries_organisations", ["organisation_id"], name: "index_industries_organisations_on_organisation_id", using: :btree
create_table "industries_profiles", id: false, force: :cascade do |t|
t.integer "industry_id"
t.integer "profile_id"
end
add_index "industries_profiles", ["industry_id"], name: "index_industries_profiles_on_industry_id", using: :btree
add_index "industries_profiles", ["profile_id"], name: "index_industries_profiles_on_profile_id", using: :tree
Les associations sont:
profile.rb
has_and_belongs_to_many :industries
industry.rb
has_and_belongs_to_many :profiles
Dans mes profils montrent, je j'essaie pour montrer l'industrie (attribut de secteur) associé à ce profil.
Je ne sais pas comment faire cela en utilisant l'association de la table de jointure HABTM.
Ma tentative actuelle est:
<% unless @profile.industries.blank? %>
<!-- @profile.industry.first.try(:sector) -->
<%= @Industry.sector.first = Industry.includes(:profile).where(profile: { @profile }) %>
<% end %>
La ligne commentée est ma tentative précédente.
Je trouve cette ressource que je pense que je l'ai suivi Rails - HABTM Relationship -- How Can I Find A Record Based On An Attribute Of The Associated Model
Comment puis-je montrer le secteur de l'industrie de profil?
contrôleur Profils a:
class ProfilesController < ApplicationController
before_action :set_profile, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!
after_action :verify_authorized
# GET /profiles
# GET /profiles.json
def index
@profiles = Profile.all
authorize @profiles
end
# GET /profiles/1
# GET /profiles/1.json
def show
end
# GET /profiles/new
def new
@profile = Profile.new
@profile.qualifications_build
@profile.build_vision
@profile.build_personality
@profile.addresses_build
@profile.industries_build
authorize @profile
end
# GET /profiles/1/edit
def edit
@profile.build_personality unless @profile.personality
@profile.qualifications_build unless @profile.qualifications
@profile.build_vision unless @profile.vision
@profile.addresses_build unless @profile.addresses
@profile.industries.build unless @profile.industries
end
# POST /profiles
# POST /profiles.json
def create
@profile = Profile.new(profile_params)
authorize @profile
respond_to do |format|
if @profile.save
format.html { redirect_to @profile }
format.json { render :show, status: :created, location: @profile }
else
format.html { render :new }
format.json { render json: @profile.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /profiles/1
# PATCH/PUT /profiles/1.json
def update
# successful = @profile.update(profile_params)
# Rails.logger.info "xxxxxxxxxxxxx"
# Rails.logger.info successful.inspect
# [email protected]
# user.update.avatar
respond_to do |format|
if @profile.update(profile_params)
format.html { redirect_to @profile }
format.json { render :show, status: :ok, location: @profile }
else
format.html { render :edit }
format.json { render json: @profile.errors, status: :unprocessable_entity }
end
end
end
# DELETE /profiles/1
# DELETE /profiles/1.json
def destroy
@profile.destroy
respond_to do |format|
format.html { redirect_to profiles_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_profile
@profile = Profile.find(params[:id])
authorize @profile
end
# Never trust parameters from the scary internet, only allow the white list through.
def profile_params
params.require(:profile).permit(:user_id, :title, :hero, :overview, :research_interest, :occupation, :external_profile,
:working_languages, :tag_list,
user_attributes: [:avatar],
personality_attributes: [:average_day, :fantasy_project, :preferred_style],
vision_attributes: [:id, :profile_id, :long_term, :immediate_challenge],
qualifications_attributes: [:id, :level, :title, :year_earned, :pending, :institution, :_destroy],
addresses_attributes: [:id, :unit, :building, :street_number, :street, :city, :region, :zip, :country, :latitude, :longitude, :_destroy],
industries_attributes: [:id, :sector, :icon])
end
end
La forme de profils comprend une forme partielle pour l'industrie des attributs en tant que:
profils forment
<%= render 'industries/industry_selector', f: f %>
industries forment
<%= simple_fields_for :industries do |iff| %>
<div class="form-inputs">
<%= iff.label "Choose your industry" %>
<%= iff.select :sector, options_from_collection_for_select(Industry.alphabetically, 'id', 'sector', @profile.industries.map{ |j| j.id }), :multiple => true %>
PRISE SUGGESTION OLEG'S DESSOUS
J'essaie de changer mon action show dans le contrôleur de profil:
def show
@profile = Profile.includes(:industries).find(params[:id])
end
-je obtenir le même résultat - rien montre pour l'industrie.
LA SOLUTION
Le problème est que j'ai appelé la jointure des industries de table profils. Je pense que cela signifiait être l'industrie singulière. Ce problème a été résolu en nommant la table de jointure dans les modèles afin qu'elle corresponde à la définition que je lui ai donnée dans le schéma.