2013-02-28 4 views
1

Можно ли изменить значение в хеше Params при вызове функции Javascript? У меня есть скрытое Div, скажем, DIV1, которое становится видимым на основе выбранного значения в поле выбора, в DIV1, у меня есть текстовое поле readonly, значение которого установлено в значение, возвращаемое вспомогательным методом.Обновление Rails Params с Javascript

Этот вспомогательный метод использует динамическую find_by, которая зависит от значения Params, но я думаю, что параметр Hash не изменяется, когда значение select Changes (поскольку оно не является полным обновлением страницы?). Пожалуйста, как мне добиться обновления, чтобы при изменении значения Value новое значение отразилось в хеше params. У меня есть: remote => true в теге form_for. Есть ли лучший подход, чем мой?

Выбрать поля в рельсах просмотра

#finance_year 
<%=f.select :financeyear, options_for_select(finance_year),{ :include_blank => 'Select a 
Financial Year' } %> 

и в OnChange событие для этого выберите

jQuery -> 
$('#finance').hide() 
value = "Select a Financial Year" 
$('#finance_financeyear').change -> 
selected = $('#finance_financeyear :selected').text() 
$('#finance').show() 
$('#finance').hide() if selected is value 

помощника Метод

def amount_owed(student) 
financeyear = params[:financeyear] 
@thisstudent = Finance.find_last_by_user_id(@student.user_id, 
:conditions => {:financeyear => financeyear }) 
if(@thisstudent) 
    @amount_owed= @thisstudent.amount_owed 
else 
    student.department.amount 
end 
end 

Я признателен за любую помощь, и я надеюсь, Я смог задать вопрос разумно.

ответ

2

Ответ AJAX.

Во-первых, мы должны добавить новый маршрут config/routes.rb сделать amount_owed() истинное действие:

get '/finance_years/amount_owed/:student_id/:financeyear' => "finance_years#amount_owed" 

Далее, мы создадим представление по умолчанию должны быть возвращены всякий раз, когда amount_owed() действие называется:

/app/views/finance_years/amount_owed.html.erb

<%= @amount_owed %> 

Итак, эта часть была простой. Теперь нам нужно отредактировать amount_owed действие поэтому он будет работать с нашими параметрами:

/app/controllers/finance_years_controller.rb

def amount_owed(student) 
    financeyear = params[:financeyear] 
    @thisstudent = Finance.find_last_by_user_id(params[:student_id], 
     :conditions => {:financeyear => financeyear }) 

    if(@thisstudent) 
     @amount_owed= @thisstudent.amount_owed 
    else 
     @amount_owed = student.department.amount 
    end 
end 

Таким образом, мы можем передать в финансовом году и студента id из хэша params и каждый раз получает значение. Теперь, чтобы предоставить нашему кофейному письму доступ к текущим переменным student_id и finance_year, я добавил пару скрытых полей в форму в файле вида:

/app/views/finance_years/_form.html.Еврорадио

<%= hidden_field_tag :student_id, @student_id %> 
<%= hidden_field_tag :finance_year, @finance_year %> 

Последний Хитрость заключается в том, чтобы изменить CoffeeScript, стреляя асинхронного запроса GET всякий раз, когда изменения выберите окно.

/app/assets/javascripts/finance_years.js.coffee

$('#finance_financeyear').change -> 
    student_id = $("#student_id").val() 
    finance_year = $("#finance_year").val() 
    selected = $('#finance_financeyear :selected').text() 
    $('#finance').show() unless selected == value 
    $.get "/finance_years/amount_owed/#{student_id}/#{finance_year}", (response)-> 
     $('#finance input[type=text]').load(response) 

И это все, что я могу сделать, находясь вдали от моей машины развития рельсы. Дайте мне знать, возникнут ли дополнительные проблемы.

+1

Спасибо, работал с небольшими изменениями, спасибо ~ – dev

+0

Рад, что я принимал участие в вашем решении. –

1

Я не специалист по рельсам, но вы не сможете изменить код на стороне сервера непосредственно из javascript. Вам нужно будет позвонить на сервер (либо в форме отправки, либо через запрос ajax), чтобы сообщить серверу обновить себя.

Чтобы уточнить, серверный код отвечает за первоначальный рендеринг страницы, но после того, как шаблон был визуализирован, он не существует на клиентской странице. Поэтому вы не можете напрямую изменить его из coffeescript/javascript. Вам необходимо отправить запрос на сервер, чтобы обработать это.

+0

Спасибо вам большое – dev