首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >5.1.4找不到模型id

5.1.4找不到模型id
EN

Stack Overflow用户
提问于 2017-11-29 15:42:44
回答 3查看 176关注 0票数 1

好吧,我是Rails的新手,一般情况下我没有太多的编码经验,所以这听起来很愚蠢,但我的问题是:

我编辑了代码,下面是我当前状态的更新,包括更多信息:

投票及选择模式:

代码语言:javascript
复制
class Voting < ApplicationRecord
  has_many :options
  validates :vote, presence: true
  accepts_nested_attributes_for :options
end

class Option < ApplicationRecord
  belongs_to :voting
end

routes.rb:

代码语言:javascript
复制
Rails.application.routes.draw do
  resources :votings do
    resources :options
  end
  root 'votings#new'
end

投票/new.html.erb:

代码语言:javascript
复制
<h1>create new poll</h1>

<%= form_with scope: :voting, url: votings_path, local: true do |form| %>
    <p>
      <%= form.label :voting %><br>
      <%= form.text_area :content %>
    </p>
    <p>
      <%= form.fields_for :option do |option| %>
          <%= option.label 'Optionen' %><br>
          <%= option.text_field :vote %>
      <% end %>
    </p>
    <p>
      <%= form.submit %>
    </p>
<% end %>

投票/展示..:

代码语言:javascript
复制
<p>
  <strong>Your Voting:</strong>
  <%= @voting.content %>
</p>
<ul>
  <p>
  <%= @options.vote %>
  </p>
</ul>

votings_controller.rb:

代码语言:javascript
复制
 class VotingsController < ApplicationController
      def show
        @voting = Voting.find(params[:id])
        @options = @voting.options
      end

      def new
        @voting = Voting.new
        @voting.options.build
  end

  def create
    @voting = Voting.new(voting_params)
    @voting.save
    redirect_to @voting
  end

  private
  def voting_params
    params.require(:voting).permit(:content, options_attributes: [:id, :vote])
  end
end

options_controller.rb:

代码语言:javascript
复制
class OptionsController < ApplicationController
  def create
    @voting = Voting.find(params[:id])
    @options = @voting.options.create(option_params)
    redirect_to voting_path(@voting)
  end

  private
  def option_params
    params.require(:option).permit(:vote)
  end
end

(我认为选项控制器中的一些代码与投票控制器加倍,我甚至不确定是否需要它)。

因此,我想在同一个页面中创建一个与其相关的选项的投票,然后在相同的页面上显示其选项的投票( voting /new.html.erb & voting /how.html.erb)。

这是我当前的错误消息:

NoMethodError in VotingsController#create 未定义的#投票方法“`vote”:0x0000000be55208

(这将在提交表单内容后显示。)因此,到目前为止,表单new.html.erb工作得很好。

他似乎不知道该怎么做

代码语言:javascript
复制
<%= @options.vote %>

来自show.html.erb

我希望进一步的信息将有助于解决这一问题。

EN

回答 3

Stack Overflow用户

发布于 2017-11-29 17:59:39

你的问题在细节上有点缺乏,所以我只想指出一些显而易见的问题,并希望它能有所帮助。

您的投票控制器显示动作使用足智多谋的应用程序所期望的投票对象ID来查找选项对象。

代码语言:javascript
复制
class VotingsController < ApplicationController
  def show
    @option = Option.find(params[:id]) # In a resource route this is a voting id!
    @voting = @option.user # what is option.user? Should be option.voting?
  end

这假设您的路由文件定义了resources :votings

票数 0
EN

Stack Overflow用户

发布于 2017-11-29 18:12:03

我可以用简单的答案来解释你的问题,希望它能帮助你排除你的疑虑。

代码语言:javascript
复制
  def create
    @voting = Voting.new(voting_params)

    @voting.save
    redirect_to @voting
  end

在这个操作中,在创建@voting之后,它被重定向到show操作,作为redirect_to @voting,这将创建一个链接

代码语言:javascript
复制
/voting/:id

在显示动作中,我们发送的是投票的id,所以在show操作中,很清楚,当我们试图获得params[:id]时,它将是表决的id,而不是选项的id --基本上应该在这里

代码语言:javascript
复制
  def show
    @voting = Voting.find(params[:id])
    @options = @voting.options
  end

希望它能帮助你调试你的疑点,我不知道你什么,让我知道进一步的指导。谢谢

票数 0
EN

Stack Overflow用户

发布于 2017-11-29 19:10:13

我假设你是在尝试用它的选项来显示投票模型。

所以RESTful网址是/voting/<voting_id>。如果选项包含在routes.rb中作为嵌套资源用于投票,则为了显示特定选项,它是/voting/<voting_id>/options/<option_id>

例如,在localhost:3000/voting/1/options/20

1是投票的id,20是选项的id。

因此,您需要将显示方法更改为:

代码语言:javascript
复制
def show
    @voting = Voting.find(params[:id])
    @options = @voting.options # Here it fetches all options for voting of the id passed 
end

我还建议将voting_params方法修改为:

代码语言:javascript
复制
def vote_params
    params.require(:voting).permit(:content, options_attributes: [:id, :vote])
end

由于一次投票有多个选项,所以需要白名单每个选项的id,否则它会覆盖。您可以在此这里上阅读更多内容。

您所拥有的模型关联非常类似于导轨中的示例。先读一读,然后重新使用代码。

编辑:

我建议现在使用form_for(在rails 5中是软推荐的)而不是form_with来工作。您的投票/new.html.erb如下所示:

代码语言:javascript
复制
<h1>create new poll</h1>

<%= <%= form_for @voting do |form| %> %>
    <p>
      <%= form.label :voting %><br>
      <%= form.text_area :content %>
    </p>
    <p>
      <%= form.fields_for :option do |option| %>
          <%= option.label 'Optionen' %><br>
          <%= option.text_field :vote %>
      <% end %>
    </p>
    <p>
      <%= form.submit %>
    </p>
<% end %>

像这样使用form_with并不适用于我,因为form_with不支持自动生成ids。但是要坚持重构,直到rails 5.2版本和form_for可以被form_with所取代。这是这个rails提交的推论

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47556587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档