1

Javascript関数が呼び出されたときにParamsハッシュの値を変更することは可能ですか?DIV1内に、選択フィールドで選択された値に基づいて表示されるDIV1などの非表示のDivがあり、その値がヘルパーメソッドによって返される値に設定されている読み取り専用のテキストフィールドがあります。

このヘルパーメソッドは、Paramsの値に依存する動的なfind_byを使用しますが、selectの値が変更されてもparam Hashは変更されないと思います(ページ全体が更新されていないため)。選択した値が変更されたときに新しい値がparamsハッシュに反映されるように、これを更新するにはどうすればよいですか。form_forタグに:remote=>trueがあります。私よりも良いアプローチはありますか?

Railsビューの[選択]フィールド

#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

私はどんな助けにも感謝します、そして私は私が賢く質問をすることができたことを望みます。

4

2 に答える 2

3

答えは 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

このようにして、params ハッシュから会計年度と学生 ID を渡して、毎回 amount_owed を取得できます。ここで、coffeeScript が現在の student_id 変数と finance_year 変数にアクセスできるようにするために、ビュー ファイルのフォームに隠しフィールドをいくつか追加します。

/app/views/finance_years/_form.html.erb

<%= 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)

そして、Rails 開発マシンから離れてできることは、それくらいです。追加の問題が発生した場合はお知らせください。

于 2013-02-28T15:07:51.387 に答える
1

私はRailsの専門家ではありませんが、JavaScriptからサーバー側のコードを直接変更することはできません。サーバーに(フォーム送信またはajaxリクエストを介して)呼び出しを行い、サーバーにそれ自体を更新するように指示する必要があります。

明確にするために、サーバーコードはページの初期レンダリングを担当しますが、テンプレートがレンダリングされると、クライアントページには存在しません。したがって、coffeescript/javascriptから直接変更することはできません。それを処理するには、サーバーにリクエストを送り返す必要があります。

于 2013-02-28T14:43:10.020 に答える