2016-12-09 12 views
0

私は新しい/編集文書のアクションに必要なオブジェクトをロードするサービスとRailsの4アプリを持っている、これはそれからの方法である:Rails:編集時にフォームに新しい値をロードするにはどうすればよいですか?

def template_variables 
    if @document.template_variables.any? 
    TemplateVariable.where(id: document_vars).each do |v| 
     next unless User.method_defined?(v.name.to_sym) 
     v.update_attribute(:text, @user.send(v.name.to_sym)) # problem line, persists the change when i don't want to 
     v.text = @user.send(v.name.to_sym) # also a problem, doesn't update the value in the form at all 
    end 
    else 
    TemplateVariable.where(id: master_vars) 
    end 
end 

私は(2つの問題のラインのためのソリューションを必要とします彼らは私が考えたちょうど2つの事であり、両方ともそこにいるはずではありませんが、私は私の問題のために両方を含んでいます)。

最初のアップデートは、モデルに変更が残っています。これは望ましくない動作です。 2行目は何もしません。論理的には、フォームのの変数にあるテキストを置き換える必要があるようです。@user.send(v.name.to_sym)です。それは何もしないようです。

この問題を解決する方法はありますか?

ボーナスポイントflash[:notice]に表示する新しい値を持つフィールドを一覧表示する方法がある場合は、

を対応するフォームコードで更新しました。

<%= v.input :text, as: :string, input_html: { value: v.object.text } %> 

値/ vsを設定しても何も変更されません。

+0

をすることができます示すように、フラッシュ通知を表示するには、ビューの設定を持っていると仮定することを設定することで、何でもフラッシュ予告などのように表示することができますフォームコードも追加しますか? – tegon

答えて

0

コントローラから渡すインスタンス変数がある場合、その変数にはビューで使用可能な値を設定できますが、保存することはできません。

たとえば、あなたは、引数を渡すか、コントローラの属性を設定することにより、新しいユーザーの姓と名を設定することができます。

#UsersController 
def new 
    @user = User.new(first_name: 'John') 
    @user.last_name = 'Smith' 
end 

ビューで

#users/new.erb.html 
<%= @user.first_name # will be John %> 
<%= @user.last_name # will be Smith %> 

しかし、あなたの場合は、update_attributeを使用しています。レコードの変更が保存されます。代わりに、インスタンス変数を作成し、値を設定します(保存しません)。ビュー/フォームの値を使用します。

その後、

@varibales = TemplateVariable.where(id: document_vars) 
@variables.each do |variable| 
    #change what you want here 
    variable.foo = 'bar' 
end 

とビュー/フォームでご@variablesオブジェクトを参照。

コントローラからビューに複数の値を渡す必要がある場合は、コントローラで1つのインスタンス変数のみを使用するようにしてください。form objectsを使用することを検討してください。

フラッシュ通知については、あなたがコントローラでは、あなたがhere

flash[:notice] = "The value of #{@variables.first.foo}" 
+0

詳細な回答ありがとうございます。これは正しいはずですが、 'v.text = @ user.send(v.name.to_sym)'のようにサービスに設定すると、_old_の値が表示されます。したがって、それを設定することで私の問題。 –

+1

これは、あなたがデータベースから取り出した何らかのオブジェクトである 'v'の値を設定していて、それで何もしないからです。これを '@ var' /インスタンス変数として設定する必要があります。そうでないと、ビューで参照する' v'はサービス/コントローラで設定した 'v'と同じではありません。新鮮なコピー – nburkley

+0

_Ah!_です。ありがとうございました。それは全く意味をなさない。 –

関連する問題