【问题标题】:Routing error while implementing create in rails 3.2在 Rails 3.2 中实现创建时出现路由错误
【发布时间】:2013-03-12 12:11:56
【问题描述】:

我是 Rails 新手。尝试实现创建操作时出现以下错误。

Routing Error

No route matches {:action=>"show", :controller=>"settings", :format=>nil}

我的控制器文件如下:-

   @settings = Setting.new(params[:settings])

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

结束

我的Routes.rb文件如下:-

resources :settings do
    member do
     post 'add'
     post 'remove'
     get 'settings/id'
    end

    collection do
     get  'add'
     get  'list' 
     post 'get_settings'
     get  'get_settings'
    end
  end

  resources :settings 

我的 rake 路线有以下几点:-

      GET    /settings/get_settings(.:format
settings#get_settings
                      GET    /settings(.:format)
settings#index
                      POST   /settings(.:format)
settings#create
                      GET    /settings/new(.:format)
settings#new
                      GET    /settings/:id/edit(.:format)
settings#edit
                      GET    /settings/:id(.:format)
settings#show
                      PUT    /settings/:id(.:format)
settings#update
                      DELETE /settings/:id(.:format)
settings#destroy
                      GET    /settings(.:format)
settings#index
                      POST   /settings(.:format)
settings#create
                      GET    /settings/new(.:format)
settings#new
                      GET    /settings/:id/edit(.:format)
settings#edit
                      GET    /settings/:id(.:format)
settings#show
                      PUT    /settings/:id(.:format)
settings#update
                      DELETE /settings/:id(.:format)
settings#destroy

我的create.html.erb如下:_

<%= form_for @setting  do |f| %>
  <% if @setting.errors.any? %>  
  <div id="errorExplanation">  
    <h2><%= pluralize(@setting.errors.count, "error") %> prohibited this setting from being saved:</h2>  
    <ul>  
    <% @setting.errors.full_messages.each do |msg| %>  
      <li><%= msg %></li>  
    <% end %>  
    </ul>  
  </div>  
  <% end %> 
</br></br>


Id: <%= f.text_field :id %><br>
Name: <%= f.text_field :name %><br>


<%= f.submit "Create" %>&nbsp;&nbsp;

我的错误日志是:-

Started GET "/settings/new" for 127.0.0.1 at 2013-03-12 18:57:09 +0530
Processing by SettingsController#new as HTML
  Rendered settings/new.html.erb within layouts/application (170.2ms)
Completed 500 Internal Server Error in 1112ms

ActionController::RoutingError (No route matches {:action=>"show", :controller=>
"settings", :format=>nil}):
  app/views/settings/new.html.erb:7:in `_app_views_settings_new_html_erb__979995
802_23360592'
  app/controllers/settings_controller.rb:29:in `new'


  Rendered C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/actionpack-3.2.1
1/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within resc
ues/layout (0.0ms)

我的 new.html:-

<h1>New setting</h1>




<%= form_for @setting  do |f| %>
  <% if @setting.errors.any? %>  
  <div id="errorExplanation">  
    <h2><%= pluralize(@setting.errors.count, "error") %> prohibited this setting from being saved:</h2>  
    <ul>  
    <% @setting.errors.full_messages.each do |msg| %>  
      <li><%= msg %></li>  
    <% end %>  
    </ul>  
  </div>  
  <% end %> 
</br></br>


Id: <%= f.text_field :id %><br>
First Name: <%= f.text_field :name %><br>


<%= f.submit "Create" %>&nbsp;&nbsp;

<% end %>




<%= link_to 'Back', settings_path %>

谁能帮帮我。

【问题讨论】:

  • 为什么你在routes.rb 中定义了两次resources :settings
  • 尝试 rake 路线,看看您有哪些路线可用
  • @arieljuod.i 已更新问题
  • @Mischa 这是我正在尝试创建的帖子

标签: ruby-on-rails ruby-on-rails-3 routing ruby-on-rails-3.2


【解决方案1】:

一个好的起点总是通过以下方式打印出您的路线:

rake routes

那么你需要在控制器中定义一个show方法:

def show
  ..
end

还有一个观点:

app/views/settings/show.html.erb

使用resources :settings,他应该认识到有一条显示路径。女巫可能是这样的:

settings_path(user.id)

resources :settings 不需要包含两次。

我猜这与您的UserController 无关。导入部分是SettingController。如果您在 /view/user/show.html.erb 上显示 SettingsShow 链接,可能会出现错误? (不是 100% 确定,需要查看更多代码,SettingController 会很有趣)。

【讨论】:

  • 正如您在路线中看到的那样,显示路径始终需要一个应该显示的 id ( /settings/:id(.:format) )。因此,请确保您始终使用 settings_path(user.id) 之类的 id 访问显示页面。并确保您在设置控制器中定义了一个 show 方法并且您有一个显示视图。
  • 你能指定我必须在 index.html 中放置 settings_path(user.id) 的位置吗??
  • 我猜你不必这么说。抱歉混淆。如果您创建一个设置,您将在此处结束:redirect_to @settings 女巫是 view\setting\show.html.erb,它知道来自@设置对象的 id。只要确保有一个 show 方法和视图本身!
  • 那么请告诉我当您收到错误时您在浏览器中的路径。
  • 是的,但那不是显示页面!所以在views/settings/new.html.erb 的某个地方必须有一个指向显示页面的链接。并且该链接需要获得一个ID!比如link_to“显示设置”,以settings_path(@setting.id)为例!
【解决方案2】:

将您的表单放入new.html.erb 而不是create.html.erb,例如:

new.html.erb

<%= form_for @setting  do |f| %>

#Your stuff

<% end %>

那么你的新动作是:

新动作

def new
 @setting = Setting.new
end 

你的控制器然后是-

创建动作:

更新:

def create
  if request.setting?
     @setting = Setting.new(params[:setting])
    # other setup for save
    if @setting.save
      flash[:notice] = 'Setting was successfully created.'
      redirect_to @setting
    else
      render :action => 'new'
    end
  end 
end

注意:当你说 create 是一个 post 方法时,没有 create.html.erb 这样的东西。此外,您应该在整个代码中使用@setting,而不是@settings,因为它在新的控制器方法中定义。

【讨论】:

  • 我试过了,但仍然没有帮助
  • 你还没有完全尝试过。请参阅我在回复中的说明。就那样做吧。没有create.html.erb,也没有复数形式。
  • 抱歉,刚刚将 @setting = Setting.new(params[:settings]) 更改为 @setting = Setting.new(params[:setting])。查看更新。它现在应该可以工作了。
  • 好的,我创建了一个新的 html 文件 new.html.erb 并将代码与单数“设置”放在一起。但仍然没有帮助
  • 。请检查并让我知道是否有任何其他更改要做
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
相关资源
最近更新 更多