【问题标题】:Ruby on rails: Need to pass drop down ID/value back to the controllerRuby on rails:需要将下拉 ID/值传递回控制器
【发布时间】:2014-01-12 19:37:36
【问题描述】:

我是 RoR 的新手,我正在尝试将用户选择的下拉 ID 传递回控制器以加载特定于业务的页面。我有一个简单的数据库,列出了十个可以正常加载的企业,但是当我选择一个选项时,我收到了这个错误:No route matches [POST] "/businesses/1/2/3/4/5/6/7 /8/9/10"

我可以让表单的动作值是动态的吗?有哪些选择?

控制器:business_controller.rb

  def home
    @business_dd = Business.find(:all)
  end

  def update
    @business = Business.find(params[:id])
    redirect_to :action => "show", :id => @business
  end

  def show
    @business_dd = Business.find(:all)
    @business = Business.find(params[:id])
  end

查看:_header.html.erb

<%= form_for :business, :url => business_path(@business_dd) do |f| %>               
        <%= f.select(:id, options_for_select(
        @business_dd.map{ |f| [f.name, f.id]}), 
        :include_blank => 'Please select') %>
        <%= f.submit "Submit" %>
    <% end %>

为下拉菜单生成的 HTML:

<form accept-charset="UTF-8" action="/businesses/1/2/3/4/5/6/7/8/9/10" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="FS7sYiq8NicsKfnUwzTTHpobtA180qOjcAOnuWNONPc=" /></div>                
<select id="business_id" name="business[id]"><option value="">Please select</option>
<option value="1">Business1</option>
<option value="2">Business2</option>
<option value="3">Business3</option>
<option value="4">Business4</option>
<option value="5">Business5</option>
<option value="6">Business6</option>
<option value="7">Business7</option>
<option value="8">Business8</option>
<option value="9">Business9</option>
<option value="10">Business10</option></select>
<input name="commit" type="submit" value="Submit" />
</form>

路线:

      Prefix Verb   URI Pattern                    Controller#Action
  businesses GET    /businesses(.:format)          businesses#index
             POST   /businesses(.:format)          businesses#create
new_business GET    /businesses/new(.:format)      businesses#new
edit_business GET    /businesses/:id/edit(.:format) businesses#edit
    business GET    /businesses/:id(.:format)      businesses#show
             PATCH  /businesses/:id(.:format)      businesses#update
             PUT    /businesses/:id(.:format)      businesses#update
             DELETE /businesses/:id(.:format)      businesses#destroy
        root GET    /                              businesses#home
      update GET    /update(.:format)              businesses#update

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 form-for


    【解决方案1】:

    在 routes.rb 中

    resources :businesses, only: [:allowed, :actions, :here]
    

    那么最好在控制器中包含动作new

    def new
      @business = Business.new
    end
    

    并将其与视图new.html.erb(不是home.html.erb)一起使用来呈现要提交的表单:

    <%= form_for @business do |f| %>  
      ...
    

    【讨论】:

    • 我实际上能够改变我填充下拉列表的方式:&lt;%= form_tag(new_business_path, method: 'get') do |f| %&gt; &lt;%= select_tag(:id, options_for_select(Business.find(:all).map{ |f| [f.name, f.id]}), :prompt =&gt; "Select Venue") %&gt; &lt;%= submit_tag "Submit" %&gt; &lt;% end %&gt;
    • 总有几种方法可以解决任何问题。如果您使用new_business_path,那么您创建了操作new。你的问题有我的答案。如果您认为您的答案更好 - 您可以添加并接受它。
    【解决方案2】:

    我能够简化下拉菜单并获得工作路径:

    <%= form_tag(new_business_path, method: 'get') do |f| %> 
       <%= select_tag(:id, 
       options_for_select(Business.find(:all).map{ |f| [f.name, f.id]}), :prompt => "Select Venue") %> 
       <%= submit_tag "Submit" %> 
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 2012-11-07
      • 2016-12-29
      • 1970-01-01
      相关资源
      最近更新 更多