2015-07-09 4 views
2

Я создал модель предпочтений для управления настройками электронной почты. Прямо сейчас вложенная форма не отображается на фактической странице. Я пробовал серию различных тактик, но не могу понять.Принимает вложенную форму атрибута для has_one не заполняется

Я убедился я предпочтение локально настроен, изменил fields_for к (@ user.preference), которые не работают и т.д.

Я использую Rails 4.2.2, Ruby версия 2.2.1 ,

схемы

create_table "preferences", force: :cascade do |t| 
    t.datetime "created_at",     null: false 
    t.datetime "updated_at",     null: false 
    t.integer "user_id",      null: false 
    t.boolean "new_match",  default: true, null: false 
    t.boolean "accepted_match", default: true, null: false 
    t.boolean "match_reminder", default: true, null: false 
    t.boolean "new_message", default: true, null: false 
    end 

модель пользователя

has_one :preference, dependent: :destroy 
    accepts_nested_attributes_for :preference 

модель предпочтения

class Preference < ActiveRecord::Base 
    belongs_to :user 
end 

фактическая форма, которая имеет содержит партиалы к вложенной форме:

<%= form_for(@user, id: "editing-info") do |f| %> 
    <ul class="tabs"> 
    <li class="tab-link current" data-tab="tab-account"> 
     <%= t("edit_user.tabs.account") %> 
    </li> 
    <li class="tab-link" data-tab="tab-interests"> 
     <%= t("edit_user.tabs.interests") %> 
    </li> 
    <li class="tab-link" data-tab="tab-settings"> 
     <%= t("edit_user.tabs.settings") %> 
    </li> 
    </ul> 

    <div class="tab-content current" id="tab-account"> 
    <%= render "users/tabs/account", f: f %> 
    </div> 

    <div class="tab-content" id="tab-interests"> 
    <%= render "users/tabs/interests", f: f %> 
    </div> 

    <div class="tab-content" id="tab-settings"> 
    <%= render "users/tabs/settings", f: f %> 
    </div> 

    <div id="button-container"> 
    <%= link_to 'Cancel', 
     user_path(current_user), 
     data: { disable_with: "Loading..." }, 
     class: "cancel-desktop" %> 

    <%= f.submit "Save", 
     data: { disable_with: "Loading..." }, 
     class: "save main-save-button-edit" %> 
    </div> 
<% end %> 

частичный, который включает гнездящийся вид

<div id="settings"> 
    <h4 class="notifications-label">Notifications</h4> 
    <div class="notifications setting-category info-holder"> 
    <div class="mobile setting-holder"> 
     <%= f.label :mobile, "Mobile", class: "setting-label" %> 
     <%= f.text_area :mobile, placeholder: "Add mobile number", class: "setting-input" %> 
    </div> 
    <div class="email-holder setting-holder main-email-edit"> 
     <%= f.label :email, "Email", class: "setting-label" %> 
     <%= f.text_area :email, placeholder: "Add email address", class: "setting-input" %> 
    </div> 
    <p class="setting-descrip">This email is where Glassbreakers notifications will be sent. Please continue to use your email associated with your LinkedIn account to sign in.</p> 
    </div> 
    <h4 class="email-label">Emails</h4> 
    <%= f.fields_for :preference do |user_preference| %> 
    <div class="email-notifications-holder"> 
     <div class="email-holder"> 
     <%= user_preference.label :new_match, "Getting a new match each week" %> 
     <%= user_preference.check_box :new_match, class: "checkbox new_match_email" %> 
     </div> 
     <div class="email-holder"> 
     <%= user_preference.label :match_reminder, "New matches Thursday reminder", class: "match_reminder_email" %> 
     <%= user_preference.check_box :match_reminder, class: "checkbox thursday_reminder_email" %> 
     </div> 
     <div class="email-holder"> 
     <%= user_preference.label :accepted_match, "A Glassbreakers accepted a match", class: "accepted_match_email" %> 
     <%= user_preference.check_box :accepted_match, class: "checkbox accept_match_email" %> 
     </div> 
     <div class="email-holder"> 
     <%= user_preference.label :new_message, "Received a new message" %> 
     <%= user_preference.check_box :new_message, class: "checkbox new_message_email" %> 
     </div> 
    </div> 
    <% end %> 
    <h4 class="connect-label">Connections</h4> 
    <div class="connections info-holder"> 
    <p class="inform">You'll receive new matches every Tuesday. Make sure to respond to your matches before then.</p> 
    <div class="pausing"> 
     <label><%= t("edit_user.settings.pausing_header") %></label> 
     <%= react_component(
     "MatchingPausedSetting", 
     { 
      matchingPaused: current_user.matching_paused?, 
      pauseMatchingURL: user_matching_pauses_path(current_user) 
     } 
    ) %> 
    </div> 
    <p class="setting-descrip pause-descrip">Pausing connections means you will not receive new potential connections each week. You will be able to send and receive new messages.</p> 
    </div> 
    <h4 class="contact-label">Contact</h4> 
    <div id="contact-info" class="info-holder"> 
    <p class="inform">Have a question? We love hearing from you. Contact Courtney, our communication manager, at <a href="mailto:[email protected]" target="_top">[email protected]</a>.</p> 
    </div> 
</div> 

контроллер пользователя, относящийся к user_params

def user_params 
    filtered_params = params.require(:user).permit(
     :email, 
     :mobile, 
     :bio_because, 
     :bio_meet, 
     :description, 
     :github_link, 
     :linkedin_link, 
     :title, 
     :twitter_link, 
     preference_attributes: [ 
     :id, 
     :new_match, 
     :accepted_match, 
     :match_reminder, 
     :new_message, 
     ], 
     user_onboard_skills_attributes: [ 
     :skill_id, 
     :industry_id, 
     :years_experience, 
     :id, 
     :_destroy, 
     ], 
     interest_ids: [], 
    ) 

    filtered_params[:user_onboard_skills_attributes] = 
     filter_user_onboard_skills_attributes(
     filtered_params[:user_onboard_skills_attributes] 
    ) 

    filtered_params 
    end 

ответ

1

Если вложенная форма на самом деле в пределах пользователя сформироваться, регулируя fields_for декларацию как и следует сделать трюк :

<%= f.fields_for @user.preference do |preference_fields| %> 

Также обратите внимание, что я переименовал переменную блока в preference_fields от f, так как вы уже используете f для своей родительской формы.

Документация имеет большое объяснение этого метода, который должен ответить на любые дополнительные вопросы:

fields_for documentation

Редактировать для потомков:

поля не были правильно отображать, потому что ваша модель пользователя не имела связанной модели предпочтений, это можно устранить, связав вручную модель предпочтений с пользователем или используя стратегию, аналогичную той, которая была найдена в этом вопросе: Rails: Create association if none is found to avoid nil errors. Предварительные меры принимаются на уровне модели, чтобы гарантировать, что ассоциация создается всякий раз, когда создается новый Пользователь.

+0

Привет @ BK22 - когда я обновил вышеуказанные рекомендации, я получил ошибку «неопределенный метод' MODEL_NAME»для ноль: NilClass " – LMo

+0

Было бы полезно, если бы вы разместили весь вид формы и метод контроллера. Из этой ошибки это звучит так, как будто у пользователя нет предпочтения, связанные с ним. – BK22

+0

Добавлена ​​полная форма, которая имеет частичную форму настроек, которая включает вложенные частичные. – LMo

0

Вы не можете получить оба поля для пользователя и настройки, используя 'f'. вам нужно получить fields_for настройки, используя

<%= f.fields_for :preference do |user_preference| %> 

и поля предпочтений вы будете использовать user_preference

+0

Это привело к той же проблеме, с которой я столкнулся сверху. – LMo

+0

Можете ли вы поделиться своим последним кодом с обновлением, пожалуйста. – Athar

+0

Добавлена ​​полная форма, которая имеет частичную форму настроек, которая включает вложенные частичные. – LMo

 Смежные вопросы

  • Нет связанных вопросов^_^