代码之家  ›  专栏  ›  技术社区  ›  GroundBeesAhh

我在rails上遇到NoMethodError,不确定如何通过另一个模型访问模型

  •  2
  • GroundBeesAhh  · 技术社区  · 10 年前

    我在rails上写了一个游戏,并试图允许用户创建他们的矿(这是一个挖矿游戏)。 我有一张供用户使用的桌子,还有一张供地雷使用的桌子。 每个用户的条目上都有一个参考ID,指向矿表中的矿ID。

    我尝试访问/users/1/mines/new时出错。

    未定义的方法“mines_path”

    我不明白为什么。

    新格式:

    <%= form_for [@mine] do |f| %>
        <%= f.label :name %>
        <%= f.text_field :name %><br>
    
        <p>Depth: <%= @mine.depth %></p>
    
        <%= f.submit "Submit", id: "submit" %>
    <% end %>
    

    控制器:

    def new
     @user = User.find(params[:user_id])
     @mine = @user.mines.new
    end
    
    def create
     @mine = @user.mines.create(mine_params)
     if @mine.save
      redirect_to users_mines_path
     else
      render new_mines_path
     end
    end
    

    路线:

    root 'welcome#index'
    resources :sessions, only: [:create]
    resources :users do
      resources :mines
    end
    resources :tools, only: [:create]
    

    如何通过用户创建新的矿?我在控制器中正确地执行了吗? 谢谢

    2 回复  |  直到 10 年前
        1
  •  0
  •   Mandeep    10 年前

    在您的路由中,用户内部嵌套了地雷,因此您需要将表单更改为如下所示:

    <%= form_for [@user,@mine] do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %><br>
    
      <p>Depth: <%= @mine.depth %></p>
    
      <%= f.submit "Submit", id: "submit" %>
    <% end %>
    

    您可以使用路径指定url选项:

    <%= form_for @mine, url: user_mines_path(@user)  do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %><br>
    
      <p>Depth: <%= @mine.depth %></p>
    
      <%= f.submit "Submit", id: "submit" %>
    <% end %>
    

    有关表格的详细信息,请参阅 Form Helpers

    也作为 @Vimsha 在您的控制器中指出,您需要使用.new而不是.create,因为create将初始化并保存您的矿。

    def create
      @mine = @user.mines.new(mine_params)
      if @mine.save
        redirect_to user_mines_path
      else
        render new_user_mine_path
      end
    end
    
        2
  •  0
  •   usha    10 年前
    1. @user.mines.create 将创建矿山。所以使用 @user.mines.new
    2. 矿山索引的命名路线为 user_mines_path
    3. 我的表演的命名路线将是 user_mine_path(@mine)
    4. 新矿场的命名路线为 new_user_mine_path

    控制器:

    def create
      @mine = @user.mines.new(mine_params)
      if @mine.save
         redirect_to user_mines_path
      else
         render new_user_mine_path
      end
    end