Rails помогает в простой форме: неопределенный метод `model_name' для Hash:Class

Я пытаюсь создать форму с простой формой драгоценного камня.

В форме должен быть список выбора всех участников конкурса. И URL-адрес действия должен быть публичным контроллером, а действие pricecompare и с идентификатором конкурсанта. Мой маршрут: pricecombare/:id

Мой маршрут.rb:

match "/finder/:id" => 'public#pricecompare'

Моя простая форма до сих пор:

<%= simple_form_for({:controller => "public", :action => "pricecompare"}, :method => "get") do |f| %>
<%= f.association :konkurrancer, :collection => Konkurrancer.all(:order => 'name'), :prompt => "Pick company" %>
<%= f.button :submit, :style => 'display: none;' %>

Я получаю эту ошибку:

undefined method `model_name' for Hash:Class

Вывод HTML, который я хочу:

<form method="post" id="new_konkurrancer" enctype="multipart/form-data" class="simple_form konkurrancer" action="/public/pricecompare" accept-charset="UTF-8">
<select style=" margin-left:10px;width:370px;float: left;
    margin-top: 10px;"name="konkurrancer[form]" id="konkurrancer_form" class="select optional"><option value="">Vælg din A-kasse:</option>
<option value="1">ASE</option>
<option value="2">Træ-industri-byg</option>
<option value="3">Journalistik, kommunikation og sprog</option>
<option value="4">Faglis fælles A-kasse (3F)</option>
<option value="5">Danske lønmodtagere</option>
</select>
<input type="submit" value="Opret konkurrence" name="commit" id="konkurrancer_submit" class="button" style="display: none;">

Обновлено:

Мой публичный контроллер:

def index
@konkurrancer = Konkurrancer
end


def pricecompare
@akasse = Konkurrancer.where(params[:id]).first
@akasserne = Konkurrancer.order(sort_column + " " + sort_direction)
end

<%= simple_form_for(:konkurrancer, :url => {:controller => "finder"}, :method => "get") do |f| %>
  <%= f.association :konkurrancer, :collection => Konkurrancer.all(:order => 'name'), :prompt => "Pick company" %>
  <%= f.button :submit, :style => 'display: none;' %>
<% end %>

И я вижу эту ошибку:

ActionController::RoutingError in Public#index

Showing C:/Rails/akasse/app/views/layouts/application.html.erb where line #95 raised:

No route matches {:controller=>"finder"}

Extracted source (around line #95):

92:                                 <%= render("shared/forside") %>
93:                         </div>
94: <div style="width:900px;float:left;margin-left:29px;margin-top:15px;"><p style="width:500px; float:left;font-weight:bolder;font-size:12px;margin-left:20px;font-family:verdana;">Find den billigeste a-kasse - Vælg din  a-kasse og se om du kan spare penge</p>
95: <%= simple_form_for(:konkurrancer, :url => {:controller => "finder"}, :method => "get") do |f| %>

ActionController::RoutingError in Public#index

Showing C:/Rails/akasse/app/views/layouts/application.html.erb where line #95 raised:

No route matches {:controller=>"finder"}

Обновить НОВЫЙ журнал ошибок:

Association cannot be used in forms not associated with an object

Extracted source (around line #96):

93:                         </div>
94: <div style="width:900px;float:left;margin-left:29px;margin-top:15px;"><p style="width:500px; float:left;font-weight:bolder;font-size:12px;margin-left:20px;font-family:verdana;">Find den billigeste a-kasse - Vælg din  a-kasse og se om du kan spare penge</p>
95: <%= simple_form_for(:konkurrancer, :url => '/finder', :method => "post") do |f| %>
96:   <%= f.association :konkurrancer, :collection => Konkurrancer.all(:order => 'name'), :prompt => "Pick company" %>
97:   <%= f.button :submit, :style => 'display: none;' %>
98: <% end %>
99: 

Я попытался изменить его на переменную экземпляра и получил эту ошибку:

NoMethodError in Public#index

Showing C:/Rails/akasse/app/views/layouts/application.html.erb where line #95 raised:

undefined method `to_key' for #<Class:0x85246c8>

Extracted source (around line #95):

92:                                 <%= render("shared/forside") %>
93:                         </div>
94: <div style="width:900px;float:left;margin-left:29px;margin-top:15px;"><p style="width:500px; float:left;font-weight:bolder;font-size:12px;margin-left:20px;font-family:verdana;">Find den billigeste a-kasse - Vælg din  a-kasse og se om du kan spare penge</p>
95: <%= simple_form_for(@konkurrancer, :url => '/finder', :method => "post") do |f| %>
96:   <%= f.association :konkurrancer, :collection => Konkurrancer.all(:order => 'name'), :prompt => "Pick company" %>
97:   <%= f.button :submit, :style => 'display: none;' %>
98: <% end %>

Мой JQuery:

$(document).ready(function() {
    // send form ved klik paa listen
    $('option').click(function ()
    {
        var form=$(this).closest('form');
        $.ajax({
          type:'post',
          url:form.attr('action'),
          data:form.serialize(),
          success:function(msg){
            $('#formcontent').html(msg);
          }
        });
    });
});

person Rails beginner    schedule 26.06.2011    source источник
comment
Возможно, вы захотите упомянуть о проблеме или ошибке.   -  person thenengah    schedule 26.06.2011
comment
Я обновил свой вопрос с ошибкой   -  person Rails beginner    schedule 26.06.2011
comment
Вероятно, вам нужно передать объект simple_form_for. Ищет модель в первом аргументе, но передается хеш. См. исходный код здесь: github.com/plataformatec /simple_form/blob/master/lib/   -  person dwhalen    schedule 26.06.2011
comment
Должна ли это быть мгновенная переменная? Если да, то как мне указать форму на правильный маршрут?   -  person Rails beginner    schedule 26.06.2011
comment
Моя ошибка: :url =› {:controller =› finder} должно быть :url =› /finder.   -  person Joey    schedule 27.06.2011
comment
Я получаю новую ошибку в поле зрения. Я разместил это в вопросе   -  person Rails beginner    schedule 27.06.2011
comment
Что вы хотите, чтобы ваша форма делала?   -  person Joey    schedule 27.06.2011
comment
Я хочу, чтобы моя форма переходила по URL-адресу отправленного варианта. Пример, если я выберу ASE и отправлю форму. Я бы пошел в /finder/1   -  person Rails beginner    schedule 27.06.2011


Ответы (1)


Хорошо, поскольку вам нужна переходная навигация с меню, вы можете реализовать ее примерно так, просто чтобы дать вам представление. Он использует javascript и jquery по умолчанию, но имеет запасной вариант, если javascript недоступен.

На ваш взгляд:

<%= form_tag "/finder/", :method => "get" %>
<%= label_tag :jump_nav, "Company" %>
<%= select_tag(:id, options_for_select(Konkurrancer.all(:order => 'name').collect { |k| [k.name, k.id] }), :id => "jump_nav") %>
<%= submit_tag "Jump to company", :id => "jump_nav_submit" %>

В вашем application.js или если вы используете активы 3.1, поместите в соответствующий файл.

$().ready(function() {
    $('#jump_nav_submit').hide();
});

$('#jump_nav').live('change', function() {
    window.location = "\/finder\/" + $(this).val();
});

Убедитесь, что jquery и приложение включены в ваши javascript_include_tags.

Затем, наконец, в вашем контроллере. Использование оператора подготовки поможет предотвратить внедрение SQL.

def pricecompare
  @akasse = Konkurrancer.first(:conditions => ["id = ?", params[:id]])
end

Я понятия не имею, что означает Konkurancer, поэтому настройте ярлыки соответствующим образом.

person Joey    schedule 27.06.2011
comment
Я обновил свой пост своим старым запросом jquery ajax. Можете ли вы показать, что мне нужно сделать запрос ajax с текущим кодом Jquery? - person Rails beginner; 27.06.2011
comment
Я думаю, что это выходит за рамки этого вопроса, который уже далеко ушел от первоначальной проблемы, как следует из названия. - person Joey; 27.06.2011
comment
Я понимаю, что создам для этого новый вопрос - person Rails beginner; 27.06.2011