2015-01-07 2 views
0

У меня есть модель для «timeline_event», которая принадлежит к sales_opportunity. Например, это может быть «вызвать перспективу» или аналогично, с параметром due_date, activity_details (необязательно) и флажком, чтобы сказать, полнота или нет. Это прекрасно работает. Я могу добавить новые timeline_events в базу данных через modal на странице sales_opportunity, которая также отлично работает. Однако, когда я пытаюсь отредактировать timeline_event (через действие контроллера редактирования timeline_events), hidden_field для sales_opportunity_id отказывается отбирать значение (оно не имеет никакого значения). Даже когда я пытаюсь установить значение:Почему мой Rails hidden_field не получает никакой ценности, когда все остальные поля работают нормально?

<%= f.hidden_field :sales_opportunity_id, :value => @sales_opportunity.id %> 

Это не добавит значения в hidden_field. Я пробовал перемещать поле внутри группы форм, но ничего не работает. У меня есть другие формы, похожие на мою модель, которые отлично работают, но по какой-то причине это не работает - может ли кто-нибудь помочь?

Моя форма:

<%= form_for(@timeline_event, :html => {:class => "form-horizontal"}) do |f| %> 
     <div class="form-group"> 
     <%= f.hidden_field :sales_opportunity_id %> 
     <%= f.label :activity, :class => "col-md-4 control-label" %> 
     <div class ="col-md-8"> 
      <%= f.text_field :activity, :placeholder => "Enter activity details" %> 
     </div> 
     </div> 
      <div class="form-group"> 
       <%= f.label :due_date, :class => "col-md-4 control-label" %> 
      <div class ="col-md-8"> 
      <div class='input-group date' id='datetimepicker' data-date-format="YY.MM.DD"> 
       <%= f.text_field :due_date, class: "form-control", data: { date_format: 'YYYY/MM/DD' }, :placeholder => "YYYY/MM/DD" %> 
       <span class="input-group-addon"> 
        <span class="glyphicon glyphicon-calendar"></span> 
       </span> 
      </div> 
      </div> 
     </div> 
     <div class="form-group"> 
      <%= f.label :event_notes, 'Activity Details', :class => "col-md-4 control-label" %> 
      <div class ="col-md-8"> 
      <%= f.text_area(:event_notes, :placeholder => "Put any notes about the activity here") %> 
      </div> 
     </div> 
     <div class="col-md-6 col-md-offset-4"> 
      <div class="checkbox input"> 
       <label> 
       <%= f.check_box :completed %> Task Completed? 
       </label> 
      </div> 
      <br> 
     </div> 
     <%= @sales_opportunity.id %> 
     <%= f.submit "Save", class: "btn btn-large btn-success" %> 
     <% end %> 

* Примечание - я включаю линию <% = @ sales_opportunity.id%> здесь, и это делает вывод правильный sales_opportunity_id для timeline_event. Все остальные поля (activity, due_date, completed) заполнены информацией о timeline_event, которую я пытаюсь редактировать.

Timeline_Events_Controller:

class TimelineEventsController < ApplicationController 
    before_action :set_timeline_event, only: [:show, :edit, :update, :destroy] 
    before_action :signed_in_user, only: [:edit, :update, :show, :index] 
    before_action :correct_org, only: [:edit, :update, :show, :index] 

    # GET /timeline_events 
    # GET /timeline_events.json 
    def index 
    @timeline_events = TimelineEvent.all 
    end 

    # GET /timeline_events/1 
    # GET /timeline_events/1.json 
    def show 
    end 

    # GET /timeline_events/new 
    def new 
    @timeline_event = TimelineEvent.new(sales_opportunity_id: params[:sales_opportunity_id]) 
    end 

    # GET /timeline_events/1/edit 
    def edit 
    @timeline_event = TimelineEvent.find(params[:id]) 
    @sales_opportunity = @timeline_event.sales_opportunity 
    end 

    # POST /timeline_events 
    # POST /timeline_events.json 
    def create 
    @timeline_event = TimelineEvent.new(timeline_event_params) 
    @sales_opportunity = @timeline_event.sales_opportunity 

respond_to do |format| 
    if @timeline_event.save 
    format.html { redirect_to @timeline_event.sales_opportunity, :flash => {:success => 'Timeline event was successfully created.'} } 
    format.json { render :show, status: :created, location: @timeline_event } 
    format.js 
    else 
    format.html { render :new } 
    format.json { render json: @timeline_event.errors, status: :unprocessable_entity } 
    format.js { render json: @sales_opportunity.errors, status: :unprocessable_entity } 
    end 
end 
end 

    # PATCH/PUT /timeline_events/1 
    # PATCH/PUT /timeline_events/1.json 
    def update 
respond_to do |format| 
    if @timeline_event.update(timeline_event_params) 
    format.html { redirect_to @timeline_event.sales_opportunity, :flash => {:success => 'Timeline event was successfully updated.'} } 
    format.json { render :show, status: :ok, location: @timeline_event } 
    else 
    format.html { render :edit } 
    format.json { render json: @timeline_event.errors, status: :unprocessable_entity } 
    end 
end 
end 

    # DELETE /timeline_events/1 
    # DELETE /timeline_events/1.json 
    def destroy 
    @timeline_event.destroy 
    respond_to do |format| 
     format.html { redirect_to timeline_events_url, :flash => {:success => 'Timeline event was successfully destroyed.'} } 
     format.json { head :no_content } 
    end 
    end 

private 
# Use callbacks to share common setup or constraints between actions. 
def set_timeline_event 
    @timeline_event = TimelineEvent.find(params[:id]) 
end 


def timeline_event_params 
    params.require(:timeline_event).permit(:sales_opportunity_id, :due_date, :activity, :completed, :event_notes) 
end 

#before filters 
def signed_in_user 
unless signed_in? 
    store_location 
    redirect_to signin_url, notice: "Please sign in." unless signed_in? 
    end 
end 

def correct_org 
    timeline_org = @timeline_event.sales_opportunity.user.organization 
    @user = current_user 
    if @user.organization_id == timeline_org.id 
    else 
    redirect_to root_url, notice: "You are not permitted to visit that page. Please create an account or sign in" 
    end 
end 
end 

Моя timeline_event модель:

class TimelineEvent < ActiveRecord::Base 
belongs_to :sales_opportunity 
validates :activity, presence: true 
validates :due_date, presence: true 
validates :sales_opportunity_id, presence: true 
end 

Я могу только представить себе, что это какая-то ошибка синтаксиса или другая глупая ошибка с моей стороны, потому что я просто не вижу ничего плохого с кодом (он идентичен всем другим формам на моем сайте). Может ли кто-нибудь увидеть, где я иду не так, пожалуйста?

Спасибо!

ответ

1

Я не согласен с @smathy, поскольку вы действительно можете передать значение в тег hidden_field, как вы это сделали.

Однако это даже не необходимо, потому что вы выполняете круговое назначение. Под этим я подразумеваю, что вы объявляете @sales_opportunity и присваиваете ему значение @timeline_event.sales_opportunity в действии вашего контроллера на edit.

Затем вы переходите к виду и пытаетесь назначить @timeline_event.sales_opportunity обратно на @sales_opportunity. Это круговая логика.

Если sales_opportunity для timeline_event, который вы редактируете, уже присутствует, и вы не хотите, чтобы пользователь мог его редактировать, зачем включать его в форму вообще? Удалите переменную экземпляра @sales_opportunity из действия edit в контроллере и просто удалите скрытое поле целиком из представления.

Посмотрите, делает ли это работу по желанию.

+0

Спасибо, Роб - это действительно решило проблему. Ранее я использовал ту же форму для добавления нового timeline_event и редактирования timeline_event, но теперь я использую Modal для добавления нового, это больше не нужно. Ваши изменения решили проблему - спасибо! – Zoinks10

0

Полевые помощники не работают так, они не принимают ключ :value. В основном название поля должно соответствовать методу объекта, который вы передали в form_for (в вашем случае @timeline_event), и именно здесь форма получит значение.

Если вы хотите, чтобы обеспечить собственное поле и значение, а затем использовать _tag семейства хелперов, например .:

<%= hidden_field_tag :name_of_field, @sales_opportunity.id %> 

Или использовать f.fields_for для создания подпола (обычно в сочетании с accepts_nested_attributes_for)

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