【问题标题】:Error while editing the custom view template in Ruby on Rails在 Ruby on Rails 中编辑自定义视图模板时出错
【发布时间】:2025-12-09 19:45:02
【问题描述】:

我试图在 ROR 中创建自定义视图页面,如 http://blog.hulihanapplications.com/browse/view/55-ruby-on-rails-multiple-model-form-generator 所示

然后我遇到了一些错误

(erb):6:in `template': compile error (SyntaxError)
(erb):3: syntax error, unexpected $undefined
...orm", :locals => {:object => @<%= singular_name ).to_s); _er...
                              ^
(erb):3: syntax error, unexpected '}', expecting ')'
...s); _erbout.concat ", :f => f} %> \n\n<%= link_to 'Show', @"
                              ^
(erb):5: syntax error, unexpected tIDENTIFIER, expecting ')'
...out.concat " %> |\n<%= link_to 'Back', "
                              ^
(erb):6: syntax error, unexpected tIDENTIFIER, expecting ')'
; _erbout.concat(( plural_name ).to_s); _erbout.concat "_path %>\n"
                                                             ^
(erb):6: unterminated string meets end of file
(erb):6: syntax error, unexpected $end, expecting ')'
; _erbout
         ^

我的编辑页面是

<h1>Editing <%= singular_name %></h1>

<%= render :partial => "_form", :locals => {:object => @<%= singular_name %>, :f => f} %> 

<%%= link_to 'Show', @<%= singular_name %> %> |
<%%= link_to 'Back', <%= plural_name %>_path %>

我的部分表单“表单”是

    <% for column in object.class.columns %>  
      <% if column.name != "id" %>  
      <div class="field">  
        <div class="label">  
          <%= f.label "#{column.name}".to_sym  %>  
      </div>  

        <% if column.type == :integer || column.type == :float || column.type == :string %>  
        <% if column.name =~ /_id$/ # is this a id/foreign key field %>  
          <% column_class = column.name.gsub(/_id$/, '').classify.constantize %>    
          <% if column_class %>  
            <%= collection_select(object.class.name.underscore.to_sym, column.name.to_sym, column_class.all, :id, :name, :prompt => true) %>  
          <% else %>  
            <%= f.text_field column.name.to_sym  %>  
          <% end %>  
        <% else %>  
          <%= f.text_field column.name.to_sym  %>  
        <% end %>  
      <% elsif column.type == :text %>  
        <%= f.text_area column.name.to_sym  %>  
      <% elsif column.type == :datetime %>  
        <%= f.datetime_select column.name.to_sym  %>    
      <% elsif column.type == :boolean %>  
        <%= f.check_box column.name.to_sym  %>        
      <% else %>  
        <% # Unknown Column Type %>  
      <% end %>       
      </div>  
    <% end %>   
    <% end %>  

这是默认的编辑页面

<h1>Editing <%= singular_name %></h1>

<%% form_for(@<%= singular_name %>) do |f| %>
  <%%= f.error_messages %>

<% for attribute in attributes -%>
  <p>
    <%%= f.label :<%= attribute.name %> %><br />
    <%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
  </p>
<% end -%>
  <p>
    <%%= f.submit 'Update' %>
  </p>
<%% end %>

<%%= link_to 'Show', @<%= singular_name %> %> |
<%%= link_to 'Back', <%= plural_name %>_path %>

【问题讨论】:

    标签: ruby-on-rails customization erb scaffolding


    【解决方案1】:

    通过更改 _form.html.erb 解决了我的问题

    <%% for column in object.class.columns %>  
        <%% if column.name != "id" && column.name !="created_at" && column.name !="updated_at" %>
        <div class="field">  
            <div class="label">  
              <%%= f.label "#{column.name}".to_sym  %>  
          </div>  
    
            <%% if column.type == :integer || column.type == :float || column.type == :string %>  
            <%% if column.name =~ /_id$/ # is this a id/foreign key field %>  
              <%% column_class = column.name.gsub(/_id$/, '').classify.constantize %>    
              <%% if column_class %>  
                <%%= collection_select(object.class.name.underscore.to_sym, column.name.to_sym, column_class.all, :id, :name, :prompt => true) %>  
              <%% else %>  
                <%%= f.text_field column.name.to_sym  %>  
              <%% end %>  
            <%% else %>  
              <%%= f.text_field column.name.to_sym  %>  
            <%% end %>  
          <%% elsif column.type == :text %>  
            <%%= f.text_area column.name.to_sym  %>  
          <%% elsif column.type == :datetime %>  
            <%%= f.datetime_select column.name.to_sym  %>    
          <%% elsif column.type == :boolean %>  
            <%%= f.check_box column.name.to_sym  %>        
          <%% elsif column.type == :date %>  
             <%%= f.text_field column.name.to_sym, :id=>"date_picker"  %>       
          <%% else %>  
            <%% # Unknown Column Type %>  
          <%% end %>       
          </div>  
        <%% end %>   
        <%% end %>  
    

    【讨论】:

      【解决方案2】:

      您试图将 ERB 放入您的 ERB 中,但您应该将 Ruby 放入您的 ERB 中。我认为:

      <%= render :partial => "_form", :locals => {:object => @<%= singular_name %>, :f => f} %> 
      

      应该是这样的:

      <%= render :partial => "_form", :locals => {:object => singular_name, :f => f} %> 
      

      &lt;%= ... %&gt; 中的所有内容都应该是 Ruby 代码,但 @&lt;%= singular_name %&gt; 不是 Ruby。

      【讨论】: