Rails:リンクを使用して値を設定します -- ruby-on-rails フィールド と ruby-on-rails-3 フィールド と forms フィールド と controllers フィールド と link-to フィールド 関連 問題

Rails: set a value using a link












3
vote

問題

日本語

編集フォームを送信するリンクを作成しようとするヘルプが必要です。

オブジェクトのリストがあるとしましょう

<事前> <コード> Object - Color - Own? Ball - Red - false - [button] Hat - Blue - true - [button] Shoe - Green - false - [button]

[ボタン]をクリックすると、「所有しています」を設定します。 trueに。

ルート

<事前> <コード> resources :toys

コントローラ

<事前> <コード> 4/0/0 3/0/7 4/0/7 4/0/3 4/0/4 4/0/1 3/0/5 3/0/1 2/0/5 2/0/3 2/0/4 2/0/6 3/0/2 1/0/3 6/0/6 6/0/12 1/0/5 1/0/4 3/0/4 0

VIEW

<事前> <コード> 4/0/0 3/0/7 4/0/7 4/0/3 4/0/4 4/0/1 3/0/5 3/0/1 2/0/5 2/0/3 2/0/4 2/0/6 3/0/2 1/0/3 6/0/6 6/0/12 1/0/5 1/0/4 3/0/4 1
英語

I need help trying to create a link that submits an edit form.

Let's say I have a list of objects

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

When I click on the [button] I want to set "Own?" to True.

Routes

  resources :toys 

Controller

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 

View

<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 %> 
</div
              

回答リスト

3
 
vote
vote
ベストアンサー
 

これはあなたのコントローラの操作をどのように設定するかについてのすべてです。私はあなたがどのようにあなたの使いたいのかを理解していますが、私はあなたがあなたの状況に適応できるべきだと思います私はあなたに見せてくれる類似のケースがあります。

私の場合は、セッション内の値を設定するメニューボタンがあり、メニューパネルを開いているか閉じたビューに囲まれています。

最初に、興味のある仕事をするつもりのコントローラアクションが必要です。私は、特定のビューまたは他のコントローラに属していないアプリケーション全体のものを処理する「SharedController」を作成しました。 <コード> class User < ActiveRecord::Base Types = [ :footballer , :tennissman ] Types.each do |type| has_one type, -> { where occupation: type.to_s }, class_name: "#{type.classify}_profile" end #.. end 16

このコントローラの操作は、セッション内の2つの値のいずれかを設定できます。 "admin_menu"(ブール値)または "advanced_search"(ブール値)。その後、特定のビューは、admin_menuまたはadvanced_searchのセッション値がtrueであるかどうかを尋ねます。

同じ論理を使うことができます。

のようなもの <事前> <コード> [this](const std::string &Name) { auto FoundSymbol = ObjectLayer.findSymbol(Name, true); if (!FoundSymbol) { if (auto SymAddr = RTDyldMemoryManager::getSymbolAddressInProcess(Name)) return JITSymbol(SymAddr, JITSymbolFlags::Exported); } return FoundSymbol; }, 7

このコントローラのアクションをリンクでトリガするリンクの取得要求を受け付けるルートを持つ必要があります。 <コード> [this](const std::string &Name) { auto FoundSymbol = ObjectLayer.findSymbol(Name, true); if (!FoundSymbol) { if (auto SymAddr = RTDyldMemoryManager::getSymbolAddressInProcess(Name)) return JITSymbol(SymAddr, JITSymbolFlags::Exported); } return FoundSymbol; }, 8 は論理的な選択です。

<事前> <コード> [this](const std::string &Name) { auto FoundSymbol = ObjectLayer.findSymbol(Name, true); if (!FoundSymbol) { if (auto SymAddr = RTDyldMemoryManager::getSymbolAddressInProcess(Name)) return JITSymbol(SymAddr, JITSymbolFlags::Exported); } return FoundSymbol; }, 9

注: $config = HTMLPurifier_Config::createDefault(); $def = $config->getHTMLDefinition(true); $def->addAttribute('img', 'data-type', 'Text'); $purifier = new HTMLPurifier($config); 0 $config = HTMLPurifier_Config::createDefault(); $def = $config->getHTMLDefinition(true); $def->addAttribute('img', 'data-type', 'Text'); $purifier = new HTMLPurifier($config); 1 よりも意味があり、<コード> $config = HTMLPurifier_Config::createDefault(); $def = $config->getHTMLDefinition(true); $def->addAttribute('img', 'data-type', 'Text'); $purifier = new HTMLPurifier($config); 2 よりも意味があります。コード>、私は $config = HTMLPurifier_Config::createDefault(); $def = $config->getHTMLDefinition(true); $def->addAttribute('img', 'data-type', 'Text'); $purifier = new HTMLPurifier($config); 4 をmy routes.rbで指定しなければなりませんでした。


その後、ParamsのURLへのリンクが必要です。パスにパラメータを追加するには、そのようにそれらをパスヘルパーに追加するだけです。

<事前> <コード> $config = HTMLPurifier_Config::createDefault(); $def = $config->getHTMLDefinition(true); $def->addAttribute('img', 'data-type', 'Text'); $purifier = new HTMLPurifier($config); 5

コントローラ内のこれらのパラメータをvia:

<事前> <コード> $config = HTMLPurifier_Config::createDefault(); $def = $config->getHTMLDefinition(true); $def->addAttribute('img', 'data-type', 'Text'); $purifier = new HTMLPurifier($config); 6

これをそのようなリンクにしてください。

<事前> <コード> $config = HTMLPurifier_Config::createDefault(); $def = $config->getHTMLDefinition(true); $def->addAttribute('img', 'data-type', 'Text'); $purifier = new HTMLPurifier($config); 7

注:これはAjaxでこれを行うのが最善ですので、必ず $config = HTMLPurifier_Config::createDefault(); $def = $config->getHTMLDefinition(true); $def->addAttribute('img', 'data-type', 'Text'); $purifier = new HTMLPurifier($config); 8 を設定してください。 Ajaxを使用しない場合は、このリンクがトリガーされた後にどのページをロードする必要があるかについて、コントローラ内のリダイレクトを指定する必要があります。


私の管理者メニューの設定リンクの場合は、可能な2つの状態とのリンクが必要です。私はヘルパーを使ってこれらを生成します:

<事前> <コード> $config = HTMLPurifier_Config::createDefault(); $def = $config->getHTMLDefinition(true); $def->addAttribute('img', 'data-type', 'Text'); $purifier = new HTMLPurifier($config); 9

ビューでは、 'Text'0 を使ってこれを呼び出すだけです。あなたが好きなら、あなたは似たことができるが、それはオプションです。

私はあなたが正しいトラックにあなたを得ることを望みます、あなたが質問があるかどうか私に知らせてください。


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

リンクの問題get requestsを取得します。これは編集アクションに行くつもりです。参照: http://guides.rubyonRails.org/routing.html#crud. - verbs-and-actions

さらなる問題は、 9988777632 の代わりに 'Text'1 を持っています(この目的のために使用したもの)。つまり、リンクヘルパーは、特異リソースを処理するのではなく、特定のおもちゃが編集することをすでに期待しています。参照: http://guides.rubyonRails.org/routing.html#singular-resources/ a>

あなたがそれを変更した場合、あなたのリンクは機能します:

<事前> <コード> 'Text'3

...そしてコントローラ内の編集アクションを次のように設定します。

 <コード> 'Text'4  

http://ガイド。 rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-Responses

今すぐに注意してください、あなたは本当にAjaxリンクを使って行うべきであり、通常はあなたの "本物の"コントローラーでそれをしないはずです。 その理由は、これで編集によって処理できる唯一の行動であるため、通常の<コード> 998876635 ビューはもうしません。 オーク。

新しいアクションと新しいルートを作成することで、これを回避できます。たとえば、

<事前> <コード> 'Text'6

は単に上記の方法をとり、 'Text'8 の代わりに 998877637 に呼び出します。 NS: <事前> <コード> 'Text'9

すべてが理にかなっていることを願っています。

 

This is all about how you setup your controller actions. I'm not totally sure I understand how you want to use yours, but I have a similar case that I'll show you which I think you should be able to adapt to your situation.

In my case, I have a menu button that sets a value in the session to either keep a menu panel open or closed across any views a user looks at.

First, you need a controller action that is going to do the work you're interested in. I created a "SharedController" which handles application-wide things that don't belong to any particular view or other controller.

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 

This controller action can set one of two values in the session, either: "admin_menu" (boolean) or "advanced_search" (boolean). Then certain views ask whether the session value for admin_menu or advanced_search is true, and if so they show the view.

You could use the same logic. Something like:

def edit   object= Object.find(params[:object_id])   object.own = params[:own]   object.save end 

To trigger this controller action with a link you need to have a route that accepts GET requests. edit is a logical choice.

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

Note: I think SharedController makes more sense than SharedsController, and edit_shared_path makes more sense than edit_shareds_path, so I had to specify :controller => 'shared' in my routes.rb.


Then you just need a link to a url with params. To add params onto a path you just add them to the path helper, like so:

edit_shared_path(:key => 'value') 

You can retrieve these params in your controller via:

params[:key] 

Make this a link like so:

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

NOTE: It's best to do this via AJAX, so be sure to set :remote=>true. If you don't use AJAX then you need to specify a redirect in your controller for what page should be loaded after this link is triggered.


In the case of my admin menu preference link, I need a link with two possible states. I generate these using a helper:

  # 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 

In a view I just call this using admin_toggle_button. You can do something similar if you like, but it's optional.

I hope that gets you on the right track, let me know if you have any questions.


EDIT: Based on your comment:

Links issue GET requests, which mean you're going to the EDIT action. See: http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

A further issue, you have resources :toys instead of resource :shared (which I used for this purpose). This means your link helper is already expecting a specific toy to edit, rather than handling a singular resource. See: http://guides.rubyonrails.org/routing.html#singular-resources

Your link would work if you changed it to be:

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

... and set your edit action in your controller to the following:

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

See: http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses

Now, be aware, you really should only do this with AJAX links, and you should normally not do it with your "real" controller. The reason is, now this is the only action that can be processed by EDIT, so your normal toys#edit view would no longer work.

You can get around this by create a new action and a new route, for instance:

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

Then simply take the same method above and call it set_ownership instead of edit. IE:

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

Hope that all makes sense.

</div
 
 
       
       
1
 
vote

9988777660 メソッド 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 のように、通常別のアクションを設定しているような状況がある場合は、<コード> params[:toy]で<コード> link_to から呼び出します。 オプション。その後、コントローラは希望どおりに属性を切り替えます。

したがって、私のルートは次のように見えます:

<事前> <コード> link_to1

と私のビューは

のように見えます <事前> <コード> link_to2

コントローラは変数を設定し、ページの適切なセクションを更新する link_to3 ファイルをバックします。

助けを願っています!

 

The edit_toy_path method that your link_to method is calling is going to the edit action inside your controller. It's not going to the update method that I'm guessing you want.

Your link_to will need to change to something like:

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

But I question this particular approach. I don't think the variable will update correctly in the update action because it is not namespaced to the proper params[:toy] object that update_attributes is expecting. And in my quick and dirty tests I couldn't get it to namespace properly.

When I have a situation like the one that you are describing I usually setup another action, like toggle_ownership and I call that from my link_to with a :remote => true option. Then the controller toggles the attributes as desired.

Thus, my routes looks something like:

resources :toys do   member do     put :toggle_ownership   end end 

And my view looks like

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

The controller sets the variable and renders back a toggle_ownership.js.erb file that updates the appropriate section of the page.

Hope that helps!

</div
 
 
 
 

関連する質問

0  link_1ページには、レールの他のページからコントローラがコントローラ  ( Link to one page but controller from another in rails ) 
スタックについての類似の質問を見ましたが、私が獲得した各答えは1つの根本的な問題に特有のものであるため、これが重複していません。 病気は簡単に保管してください。リンクをクリックする方法を知りたいのですが、ユーザーに1ページに移動しましょうが、DEFを別のペー...

19  link_to:action => 'create' 'create'ではなくインデックスに行く  ( Link to action create going to index rather than create ) 
私はRORを学ぶためにかなり単純なレシピアプリを構築しています。 link_to。 残念ながら、何らかの理由でlink_toはcreateではなくインデックス関数を呼び出しています。 link_toをに書きました <前> &lt;%=「このレシピを保存」、...

1  LINK_TO問題をレール  ( Rails link to problem ) 
リンクを構築しようとしています。結果のリンクはこのようなものを見るべきです: <事前> <コード> http://localhost:3000/re_goal/edit/2 これは私が思いついたものです: <事前> <コード> <%= @issue.re_...

-2  データベースにリンクを保存して表示する方法  ( How to save links in a database and display them ) 
私はRails Blogアプリケーションに取り組んでおり、投稿にユーザーのタグを追加する必要があります。 例私は以下を書いて投稿する。 '私の犬の名前はジョンです。 #dogs ' その投稿のクリック可能なテキストを犬が欲しいです。 クリック可能な#DOGSテ...

0  LINK_TOとAJAXリクエストをレール4にリクエストする  ( Link to and ajax request in rails 4 ) 
次のことがあります: <事前> <コード> <%= link_to "Some_link", some_path, class: "btn btn-success btn-xs", id: "contact", "data-sid" => item.id %>...

0  link_toアクション "Show"を別のコントローラに表示します  ( Link to action show to another controller ) 
Ruby 1.9.2p290 レール3.1.1 基本的に私は2つのモデルを持っています:シェフとレシピ。 <事前> <コード> class Chef < ActiveRecord::Base has_many :recipes end clas...

0  Rails To To Rails ...単一のページの特定のアンカーポイントを設定して呼び出す方法  ( New to rails how do i set and call specific anchor points for a single page ) 
だから私は単一のページのポートフォリオを作成したいと思うように、ユーザーがナビゲーションバーをクリックすることができ、ページの特定のセクションにジャンプするようにアンカーポイントを設定します。これまでのところ私は私のアンカーポイントを設定するためにこれを持って...

1  link_toヘルパーを使用して部分的にレンダリングすることは可能ですか?  ( Is it possible to render partial using link to helper ) 
LINK_TOヘルパーを使用したコントローラのアクションへのリンクを含む単純なナビゲーションを備えたRails 3アプリケーションを持っています。 今、私は部分を参照するリンクを追加する必要があります。 LINK_TOとレンダリングを組み合わせることは可能で...

1  以前のリクエストからParamsハッシュの特定の部分とリンクを構築するにはどうすればよいですか。  ( How do i build link with specific part of params hash from previous request ) 
通常このようなページを作成していないときは、変更できない現在の制約です。 ページにはチェックボックスフォームとテーブルを並べ替えるTHSのリンク付きのテーブルがあります。リンクボックスアイテムがすでにチェックされているチェックボックスアイテムを保持するように...

0  link_を確認して、答えに関係なくアクションを実行します。  ( Link to confirm no matter the answer will always execute the action ) 
リンクを押すと確認がポップアップされますが、yesまたはいいえに応答しても、常にアクションを実行してレコードを削除します。 ビュー: <事前> <コード> link_to "Remove", gamep, :method => :delete, :confir...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有