2011-07-12 12 views
2

編集フォームを送信するリンクを作成しようとすると助けが必要です。Rails:リンクを使用して値を設定する

はのは私が設定したい[ボタン]をクリックすると、私はオブジェクト

Object - Color - Own? 
Ball - Red - false - [button] 
Hat - Blue - true - [button] 
Shoe - Green - false - [button] 

のリストを持っているとしましょう「オーナー?」真になる

ルート

resources :toys 

コントローラ

def edit 
    @toy = Toy.find(params[:id]) 
end 

def update 
    @toy = Toy.find(params[:id]) 
    if @Toy.update_attributes(params[:toy]) 
    flash[:notice] = "Toy Updated" 
    redirect_to @toy 
    else 
    render 'edit' 
    end 
end 

ビュー

<h2>Toys</h2> 
    <% if @toys %> 
    <% @toys.each do |toy| %> 
      <%= toy.name %> - <%= link_to 'Set Own', edit_toy_path(:id=>toy.id, :owned=>'true')%> 
    <br/> 
    <% end %> 
<% else %> 
    None 
<% end %> 
+0

下記の更新された回答。 – Andrew

答えて

2

これはどのように設定して、コントローラのアクションについてのすべてです。どのようにあなたのものを使いたいのか分かりませんが、あなたの状況に適応できるはずのものを私が見せてくれる同様のケースがあります。

私の場合、セッション内の値を設定してメニューパネルを開いたり閉じたりすることができます。

まず、あなたが興味のある仕事をする予定のコントローラアクションが必要です。特定のビューや他のコントローラに属さないアプリケーション全体のものを処理する "SharedController"を作成しました。

class SharedController < ApplicationController 

    # Used by AJAX links to set various settings in shared views 
    def edit 
    session[:admin_menu] = params[:admin_menu].to_sym if params[:admin_menu] 
    session[:advanced_search] = params[:advanced_search].to_sym if params[:advanced_search] 

    render :nothing => true 
    end 
end 

このコントローラのアクションのいずれか、セッション中の2つのいずれかの値を設定することができる:「admin_menu」(論理値)または「advanced_search」(論理値)。次に、特定のビューは、admin_menuまたはadvanced_searchのセッション値がtrueかどうかを確認し、そうであればビューを表示します。

同じロジックを使用できます。何かのように:

このコントローラアクションをリンクで起動するには、GET要求を受け入れるルートが必要です。 editは論理的な選択です。

resource :shared, :only => [:edit], :controller => 'shared' 

注:私はSharedControllerSharedsControllerより理にかなっていると思うし、edit_shared_pathedit_shareds_pathより理にかなっているので、私は私のroutes.rbをして:controller => 'shared'を指定する必要がありました。


次に、paramsのあるURLへのリンクが必要です。経由

edit_shared_path(:key => 'value') 

あなたのコントローラでこれらのparamsを取得できます:、あなただけのパスヘルパーに追加し、パス上にのparamsを追加するので、同じよう

params[:key] 

はそうのように、このリンクを作ります

link_to 'Set Own to True for This Object', edit_shared_path(:object_id=>object.id, :own=>'true') 

注:これは、AJAXを経由して、これを行うのがベストですので、を設定してください。 AJAXを使用しない場合は、このリンクがトリガーされた後に読み込まれるページのリダイレクトをコントローラで指定する必要があります。私の管理者メニューの嗜好リンクの場合は


、私は2つの可能な状態とのリンクが必要です。私はちょうどadmin_toggle_buttonを使用して、これを呼び出すビューで

# Shows Admin Menu Button 
    def admin_toggle_button 
    if session[:admin_menu] == :on 
     link_to('Admin Tools', edit_shared_path(:admin_menu => :off), :remote=>true, :class => 'selected', :id => 'admin_toggle_button', :title => 'Hide Admin Menu') 
    else 
     link_to('Admin Tools', edit_shared_path(:admin_menu => :on), :remote=>true, :id => 'admin_toggle_button', :title => 'Show Admin Menu') 
    end 
    end 

:私はこれらのヘルパーを使用して生成します。あなたは好きなことをすることができますが、オプションです。

質問がある場合は、正しい軌道に乗ることができたら幸いです。


EDIT:あなたのコメントに基づいて:

リンクの問題は、EDITアクションに行っているわけ要求をGET。参照:http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

さらに問題が発生すると、resource :sharedの代わりにresources :toys(この目的のために使用しました)があります。これは、あなたのリンクヘルパーが、単一のリソースを扱うのではなく、特定のおもちゃが既に編集を期待していることを意味します。参照:http://guides.rubyonrails.org/routing.html#singular-resources

あなたのリンクは、あなたがするそれを変更した場合に動作します:

link_to 'Set Own', edit_toy_path(@toy, :owned=>'true'), :remote => true 

...そして次にあなたのコントローラであなたのeditアクションを設定します。

def edit 
    @toy = Toy.find(params[:id]) 
    @toy.owned = params[:owned] 
    if @toy.save! 
    head :ok 
    else 
    head :internal_server_error 
    end 
end 

を参照してください:http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses

本当にこれはAJAXリンクでのみ行うべきであり、通常は "実際の"コントローラでは行わないことに注意してください。理由は、これがEDITで処理できる唯一のアクションであるため、通常のtoys#editビューは機能しなくなります。あなたがすることによって、たとえば、新しいアクションと新しいルートを作成するには、この問題を回避することができます

resources :toys do 
    member do 
    get 'set_ownership' 
    end 
end 

はその後、単純に上記と同じ方法を取るとset_ownershipの代わりeditそれを呼び出します。 IE:

class ToysController < ApplicationController 
    ... 
    def set_ownership 
    ... 
    end 
end 

すべてが意味をなされることを願っています。

+0

ありがとう、これは多くの助けになります。私は、あなたを助けるために、より詳細な質問を更新しました。私は最初からこれらを残して申し訳ありません。今すぐ「所有」リンクをクリックすると、編集フォームに移動します。私は完全にフォームを提出し、成功メッセージをフラッシュする方法を理解する必要があります。何かご意見は。 – jlarry

+0

これは私のために働いたが、私はget 'set_ownership'をputに切り替えなければならなかった。 – jlarry

+0

興味深いことに、あなたは ':method =>:put'を使っていましたか?うれしいことにどちらかの方法で働いた。 – Andrew

1

link_toメソッドが呼び出す方法は、コントローラ内のeditアクションになります。私が望んでいると思っているのは、updateメソッドにはありません。

あなたlink_toのようなものに変更する必要があります。

<%= link_to 'Set Own', toy_path(:id=>toy.id, :owned=>'true'), :method => :put %> 

しかし、私は、この特定のアプローチを疑問視。 update_attributesが予期している適切なparams[:toy]オブジェクトに名前空間がないため、変数が更新アクションで正しく更新されるとは思わない。私の迅速で汚れたテストでは、名前空間に正しく到達できませんでした。

あなたが説明しているような状況になると、私は通常toggle_ownershipのような別のアクションを設定し、私はそれをlink_toから:remote => trueオプションで呼び出します。次に、コントローラは、必要に応じて属性を切り替える。

このように、私のルートはのようになります。

resources :toys do 
    member do 
    put :toggle_ownership 
    end 
end 

とコントローラが変数を設定し、ページの適切なセクションを更新toggle_ownership.js.erbファイルをバックレンダリング

<%= link_to 'Set Own', toggle_ownership_toy_path(toy.id), :method => :put %> 

のように私の見解が見えます。

希望に役立ちます!

+0

情報ありがとう、これはこれで多くの助けとなりました。 – jlarry

関連する問題