从另一个控制器

时间:2016-02-04 18:25:58

标签: ruby-on-rails

我有ideas controllerstatic_pages controller。后者有home动作,显示所有想法,我也用作根路径。

我希望用户能够编辑显示的想法。到目前为止我有这个:

<% if @ideas.empty? %>
  <p>Share your ideas! See what people think about it.</p>
<% else %>
  <% @ideas.each do |idea| %>
    <div class="panel panel-default">
      <div class="panel-heading"><%= idea.name %></div>
      <div class="panel-body"><%= idea.description %> <br>
      <%= link_to 'Edit', edit_idea_path(idea.id) %>
      </div>
    </div>
  <% end %>
<% end %>

我遇到了一个空想法ID的问题,我通过在idea.id内添加edit_idea_path来解决这个问题

现在我的问题是,这是正确的 Rails方式吗?我可以通过其他方式从此索引页面获取构思对象,并在ideas controller而不是static_pages controller中使用它吗?

我尝试过使用路由,但是尽管阅读了指南和其他代码,但我对它的理解非常模糊。我很欣赏有关此事的任何见解。

1 个答案:

答案 0 :(得分:2)

首先,您需要了解项目的要求定义了您应该在代码中执行的操作,而不是关于正确执行某些操作的方法。您只需遵循rails惯例。

http://guides.rubyonrails.org/active_record_basics.html#convention-over-configuration-in-active-record

现在,回到你的问题。您只需要在ideas_controller中创建一个操作(将处理视图),该操作将管理de static_pages_controller发出的数据版本,我将调用它(仅作为例如)edit_static_ideas并使用params接收数据:

在您的ideas_controller中:app / controllers / ideas_controller.rb

def edit_static_ideas
   @idea = Idea.find(params[:id])

end

然后,您需要在views-&gt; ideas文件夹中创建视图。一个名字,只是为了继续我的例子,我将它命名为edit_static_idea.html.erb。并将您在@idea中获得的数据的负载设置为表单或form_for。然后,您可以提交已编辑的数据并将其上传到其他操作中。

然后你必须配置你的路线文件并添加

配置/ routes.rb中

get 'edit_static_idea/:id', to: 'ideas#edit_static_idea', as: 'edit_ideas'

之后,如果你在你的控制台(在rails项目中)运行“rake routes”,你应该会看到你的新路线(是的!)

现在你必须在路线中选择路径并在static_pages_controller的视图中使用它,将其重定向到ideas_idea的视图处理ideas_controller。并确保您还发送所选项目的ID。

应用程序/视图/ static_pages / home.html.erb:

<%= link_to 'Edit Idea', insert_your_edit_idea_obtainedinrakeroutes_path(id: idea.id) %>

最后,您只需要在edit_static_idea.html.erb中配置表单并为其分配上传/保存路由并将其重定向到您想要的视图。

例如:

在您的路线文件中:config / routes.rb

 patch 'save_edited_idea', to: 'ideas#save_edited_idea', as: 'save_edited_idea'

在您的ideas_controller中:app / controllers / ideas_controller.rb

    def save_edited_idea
    @idea = Idea.find(params[:id])
    respond_to do |format|
      if @idea.update(idea_params)
        format.html { redirect_to the_view_that_you_want_path(id: @idea.id), notice: 'Data saved without problems.' }
      else
        flash.now[:alert] = "error"
        format.html { render :offer  }
      end
    end
  end

我不想这么详细,因为我想帮助你理解你必须做的事情。我希望它有所帮助:P