1

ビューから別のビューに値を渡して、Rails 3に別のフォームを入力するにはどうすればよいですか?

私はレールに不慣れで、これを達成する方法について少し混乱しています。これが私のシーンリオです。

クライアントとセールススキャフォールドを生成し、クライアントのインデックスビューに、クライアントを検索してその下にレンダリングする検索テキストフィールドを配置しました。各クライアントにはSaleというボタンがあり、クリックするとnew_sales_pathにリダイレクトされ、フォームの一部のフィールドにクライアントの値(名前、住所、ID、電話番号など)が自動的に入力されます。

だから私がやりたいのは、「販売」ボタンがクリックされたときにクライアントの情報を渡し、次にnew_salesフォームを作成したいということです。

だから私はインデックスクライアントビューにこのコードを持っています:

<%= form_tag clientes_path, :method => 'get', :id => "clientes_search", :class => "form-search" do %>
<p>
<%= text_field_tag :search, params[:search], :class => "input-medium search-query" %>

<%= submit_tag "Search", :name => nil, :class => "btn" %>

<% @clients.each do |client| %>
<tr>
<td><%= client.id %></td>
<td><%= client.email %></td>
...
...
<%= link_to t('.edit', :default => t("helpers.links.edit")),
                  edit_client_path(client), :class => 'btn btn-mini' %>
<%= link_to "Sale", new_sale_path, :action => 'sale_button', :id => 'sale_button', :class => 'btn btn-mini' %>
<% end %>
</tr>
<% end %>

私のアプリケーションヘルパーには次のものがあります。

def sale_button
@sale_button = client
end

私のクライアントとセールスコントローラーには、次のようなラインがあります。

helper_method :sale_button

そして、私の新しい販売ビューでは、

<div id='sales'>
<%= simple_form_for @sale, :html => { :class => 'form-horizontal' } do |f| %> 
<%= f.input :client, :label => "Client ID", :required => true, :as => :string, :input_html => { :value => @sale_button.id } %>
...
... 
<% end %>

私はそれを正しい方法で行っているのか、それとも何か足りないものがあるのか​​わかりません。どんな助けや入力も歓迎します。

Rails3.2を使用しています


セールスコントローラー

class SalesController < ApplicationController
before_filter :authenticate_user!
helper_method :sort_column, :sort_direction
helper_method :boton_venta


  # GET /sales
  # GET /sales.json
  def index
    @sales = Sale.search(params[:search]).order(sort_column + " " + sort_direction).paginate(:per_page => 10, :page => params[:page])
    @lista_porcentajes = Porcentaje.all
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @sales }
      format.js
    end
  end

  # GET /sales/1
  # GET /sales/1.json
  def show
    @sale = Sale.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @sale }
    end
  end

  # GET /sales/new
  # GET /sales/new.json
  def new
    @sale = Sale.new
    @client = Client.find(params[:client_id])
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @sale }
      format.json { render json: @client }
    end
  end

  # GET /sales/1/edit
  def edit
    @sale = Sale.find(params[:id])
  end

  # POST /sales
  # POST /sales.json
  def create
    @sale = Sale.new(params[:sale])

    respond_to do |format|
      if @sale.save
        format.html { redirect_to @sale, notice: 'Sale was successfully created.' }
        format.json { render json: @sale, status: :created, location: @sale }
      else
      format.html { render action: "new" }
        format.json { render json: @sale.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /sales/1
  # PUT /sales/1.json
  def update
    @sale = Sale.find(params[:id])

    respond_to do |format|
      if @sale.update_attributes(params[:sale])
        format.html { redirect_to @sale, notice: 'Sale was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @sale.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /sales/1
  # DELETE /sales/1.json
  def destroy
    @sale = Sale.find(params[:id])
    @sale.destroy

    respond_to do |format|
      format.html { redirect_to sales_url }
      format.json { head :no_content }
    end
  end

  private

  def sort_column
    Sale.column_names.include?(params[:sort]) ? params[:sort] : "id"
  end

  def sort_direction
    %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
  end
end

ルート.rb

Puntodeventa::Application.routes.draw do

  resources :empresas

  resources :cliente_grupo_empresas

  devise_for :users, :admin_empresas, :empresa_users, :cliente_users, :admins

  resources :relacion_porcentaje_grupoempresas

  resources :relacion_grupo_empresas

  resources :porcentajes

  resources :categoria_empresas

  resources :grupo_empresas

  resources :sales

  resources :cliente_empresas

  resources :clients

  get "home/index"

  resources :productos

  root :to => "home#index"

すくいルート

sales GET    /sales(.:format)                                      sales#index
                                  POST   /sales(.:format)                                      sales#create
                         new_sale GET    /sales/new(.:format)                                  sales#new
                        edit_sale GET    /sales/:id/edit(.:format)                             sales#edit
                             sale GET    /sales/:id(.:format)                                  sales#show
                                  PUT    /sales/:id(.:format)                                  sales#update
                                  DELETE /sales/:id(.:format)                                  sales#destroy

sales new.html.erb

<%- model_class = @sale.class -%>
<h1><%=t '.title', :default => t('helpers.titles.new', :model =>     model_class.model_name.human,
                               :default => "New #{model_class.model_name.human}") %>      </h1>
<%= render :partial => 'form' %>

salesnew.html.erbでレンダリングされているフォーム

    <div id='sales'>

<%= simple_form_for @sale, :html => { :class => 'form-horizontal' } do |f| %>

  <%= f.input :client, :label => "Serial del cliente", :required => true, :as => :text, :input_html => { :value => ' ' } %>
  <%= f.association :client, :label_method => :nombre, :label_value => :id, :required => true, :as => :string %>
  <%= f.association :porcentaje, :label_method => :porcentaje, :value_method => :porcentaje, :required => true %>
  <%= f.input :monto_venta, :required => true, :as => :string %>
  <% if current_user.try(:admin?) %>
  <%= f.association :empresa, :label_method => :nombre, :value_method => :id, :required => true %>
  <% else %>
  <% f.association :empresa, :disabled => true, :input_html => { :value => current_user.empresa_id } %>
  <% end %>
  <div class="form-actions">
    <%= f.button :submit, :class => 'btn-primary' %>
    <%= link_to t('.cancel', :default => t("helpers.links.cancel")),
                sales_path, :class => 'btn' %>
  </div>
<% end %>

</div>

提案した変更を含む新しい販売ビュー。

<table class="table table-striped">
  <thead>
    <tr>
      <th><%= sortable "id", "Id" %></th>
      <th><%= sortable "name", "Name" %></th>
      <th><%= sortable "grupo_empresa", "Grupo" %></th>
      <th><%= sortable "telefono", "Telefono" %></th>
      <th><%= sortable "celular", "Celular" %></th>
      <th><%= sortable "email", "Email" %></th>
      <th><%= sortable "serial_cliente", "Serial del cliente" %></th>
      <th><%= sortable "puntos_cliente", "Puntos del cliente" %></th>
        <th><%= sortable "created_at", "Creado el" %></th>
        <th><%=t '.actions', :default => t("helpers.actions") %></th>
    </tr>
  </thead>
  <tbody>
    <% @clients.each do |client| %>
      <tr>
        <td><%= client.id %></td>
        <td><%= link_to client.nombre, client_path(client) %></td>
        <td><%= client.grupo_empresa.nombre %></td>
        <td><%= client.telefono %></td>
        <td><%= client.celular %></td>
        <td><%= client.email %></td>
        <td><%= client.serial_client %></td>
          <td><%=l client.created_at %></td>
        <td>
          <%= link_to t('.edit', :default => t("helpers.links.edit")),
                      edit_client_path(client), :class => 'btn btn-mini' %>
        <%= link_to "Sale", new_sale_path, :client_id => client.id , :id => 'boton_venta', :class => 'btn btn-mini' %>
        </td>
      </tr>
    <% end %>
  </tbody>
</table>
4

2 に答える 2

1

注意深く耳を傾ける、

次のリンク「販売」は、アプリケーションのどこかにあるはずです。

<%= link_to "Sale", new_sale_path, :client_id => client.id , :class => 'btn btn-mini' %>

ユーザーがそのリンクをクリックすると、link_to メソッドがパスをチェックし、それを「new_sale_path」として言及しました。

あなたの「レーキルート」から、

new_sale GET    /sales/new(.:format)                                  sales#new

new_sale_path が sales#new( sales controller, new action) を参照していることは明らかです

アンダースコアパスを追加すると、レールがそれを処理します。たとえば、edit_sale_path は販売コントローラーを実行し、アクション/メソッドを編集します。

このステップの後、sales コントローラーの新しいアクションが実行されるため、Rails は app/views/sales で "new.html.erb" ファイルを探します。

存在する場合、その html.erb ファイルがブラウザに表示/レンダリングされます。

上記の動作を理解する必要があります。

では、具体的に説明しましょう。

その販売リンクがクリックされると、アプリケーションは、params ハッシュのパラメーターとして :client_id を持つ sales#new アクションに到達します。

次のようにその params ハッシュにアクセスできます。

@client = Client.find(params[:client_id])

あなたはそれをしました。上記のステートメントは、渡された :client_id を入力として受け取り、Client モデルと find メソッドを使用してデータベースから適切なクライアントを見つけます。

インスタンス変数は、:client_id に一致する Clients テーブルのレコードで設定されます。

インスタンス変数は @client です。

今、あなたのビューでは、インスタンス変数 @client を次のように使用できますが、これは行っていないか、Im が表示されていません。app/views/sales/_form.html.erb には何がありますか?

それも投稿してください。

<%- model_class = @sale.class -%>
<h1><%=t '.title', :default => t('helpers.titles.new', :model =>     model_class.model_name.human,
                               :default => "New #{model_class.model_name.human}") %>      </h1>
<%= render :partial => 'form' %>

以下のように form_for を使用すると、

<% form_for @client do |client| %>

<% text_field_tag client.name %>
-
-
-

<% end %>

クライアントの名前が事前に入力される te​​xt_field があります。

何かわからないことがあれば、教えてください。

理解できたことがほとんどなく、理解できなかった場合は、教えてください。

すべてを理解したら、教えてください。

ありがとう。

于 2012-05-08T15:01:44.757 に答える